Задавайте вопросы, мы ответим
Вы не зашли.
Привет всем !
Не могу решить задачку... Есть список фотографий в одной табличке и список статусов фотографий во второй. Нужно вывести на экран список фото одного проекта. Я упросил таблички и значения для примера.
sp_foto (id_foto,file_name,proj)
1/путь к_Фотке_1,Проект1
2/путь к_Фотке_2,Проект1
3/путь к_Фотке_3,Проект1
4/путь к_Фотке_0,Проект2
status (id_record,id_foto,status,id_user)
1/1/1/1 - пользователь 1 поставил статус 1 для фото c id=1
2/1/2/3 - пользователь 3 поставил статус 2 для фото c id=1 *
3/2/1/1 - пользователь 1 поставил статус 1 для фото c id=2
4/3/1/1 - пользователь 1 поставил статус 1 для фото c id=3
Если во 2 таблице нет двойных записей для какой-то фотографии (исключая запись, отмеченную звездочкой), то прокатывает отлично такой запрос:
Неактивен
Неактивен
Точнее
Неактивен
vasya написал:
Точнее
SELECT * FROM `sp_foto` a LEFT JOIN status b ON (a.`id_foto`=b.`id_foto` and b.id_user=1) WHERE a.`proj` = 'Проект1';
УРА !
Спасибо земляк :-) Никогда не залезал в ON условие, считая его за способ объединения, а оно вон как ! :-)
Неактивен
Орловчане - редкие гости. Вы, емнип, второй. Или остальные шифровались.
ON и есть условие объединения, но оно может состоять из нескольких условий.
Разница между запросами принципиальная.
1. SELECT * FROM `sp_foto` a LEFT JOIN status b USING (`id_foto`) WHERE a.`proj` = 'Проект1' and b.id_user=1;
за счет условия на правую таблицу в части where фактически превращает left join в inner join
т.е. запрос вернет только те фото, у которых есть статус, выставленный пользователем.
2. SELECT * FROM `sp_foto` a LEFT JOIN status b ON (a.`id_foto`=b.`id_foto` and b.id_user=1) WHERE a.`proj` = 'Проект1';
в этом случае мы по сути делаем LEFT JOIN (SELECT * FROM `status` WHERE id_user=1) b ON a.`id_foto`=b.`id_foto`
т.е. у нас будут все фото + статусы к некоторым из них
Для id_user=1 разницу в выполнении запросов вы не заметите, а вот если возьмете id_user=3, то получите разный результат.
Неактивен
Спасибо, пока не переварил (а может уже и вечер)... Я тут переделываю себе небольшой сайтик, ну и как водится, небольшие улучшения выливаются в глобальные проблемы... Подскажите, пожалуйста еще один запрос. Опять 2 таблицы - комментарии и статусы комментариев. Т.е. на одну и ту-же фотку 2 пользователя могут оставить комменты, но один из пользователей не хочет чтобы его тексты были видны всем кроме админа и его самого (это я уже решаю в PHP скриптах).
comments (img_id, user_id,text)
1/1/Text_user_1
1/4/Text_user_4
1/2/Text_user_2
1/1/Text_user_1_second
comments_status (img_id, user_id, status) // 0 или NULL - можно всем, 1- не показывать всем
1/1/0
1/2/0
1/4/1 // этот пользователь не хочет показывать свои комменты
т.е. для пользователя 1 должны получиться 3 записи, ну или когда во второй таблице в последней записи поставить статус 0 или удалить запись, то должны быть показаны 4 записи.
Если неправильно построены таблицы (концептуально)- буду рад совету, переделаю.
Неактивен
Неактивен
vasya написал:
select img_id, user_id, `text` from comments where user_id not in (select user_id from comments_status where `status`=1);
покажет пользователю №1 3 записи
но пользователю №4 не покажет ничего! Если вы решаете это не на уровне php, то запрос нужно будет усложнять.
Немного не так сформулировал вопрос, уточняю словами - если какой-либо пользователь запретил читать его сообщения по конкретной фотографии, то только сообщения с определенным img_id не доступны всем остальным. Сам же он может читать все другие "открытые для чтения" записи, как и другие пользователи могут читать его комменты по другим, "не закрытым" фотографиям.
Неактивен
Неактивен
vasya написал:
select img_id, user_id, `text` from comments where (img_id, user_id) not in (select img_id, user_id from comments_status where `status`=1 and user_id <> №);
№ - это id текущего пользователя, чтобы тому кто запретил показывались его собственные запрещенные комментарии.
Не то, показалась только 1 запись... Ведь тут наверняка нужно LEFT JOIN... Ковыряю дальше
Все верно, были изменения в данных, вот и не получалось. Добавил в конце AND img_id=N и все стало красиво :-)
Спасибо большое !
Отредактированно Larush (17.10.2016 21:09:25)
Неактивен