SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.10.2016 17:35:40

Larush
Участник
Зарегистрирован: 16.10.2016
Сообщений: 7

LEFT JOIN с условием для правой таблицы

Привет всем !
Не могу решить задачку... Есть список фотографий в одной табличке и список статусов фотографий во второй. Нужно вывести на экран список фото одного проекта. Я упросил таблички и значения для примера.

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 таблице нет двойных записей для какой-то фотографии (исключая запись, отмеченную звездочкой), то прокатывает отлично такой запрос:

SELECT * FROM `sp_foto` a LEFT JOIN  status b USING (`id_foto`) WHERE a.`proj` = 'Проект1';

итого 3 записи

Если во второй таблице есть записи (разных пользователей) относящихся к одной и той же фотографии, то получаю задвоение записи, т.е. кол-во фото увеличивается на 1 и получаю 4 записи.

Как построить запрос таким образом чтобы в результате были 3 записи, при этом отражались бы данные для конкретного пользователя (к примеру для 1). Для визуализации вопроса- Нужно показать пользователю список всех фотографий Проекта1 и только ЕГО отметки статусов.

Спасибо всем :-)

Неактивен

 

#2 16.10.2016 17:50:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: LEFT JOIN с условием для правой таблицы

SELECT * FROM `sp_foto` a LEFT JOIN  status b USING (`id_foto`) WHERE a.`proj` = 'Проект1' and b.id_user=1;

Оно?

Неактивен

 

#3 16.10.2016 17:52:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: LEFT JOIN с условием для правой таблицы

Точнее


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';

Неактивен

 

#4 16.10.2016 18:01:18

Larush
Участник
Зарегистрирован: 16.10.2016
Сообщений: 7

Re: LEFT JOIN с условием для правой таблицы

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 условие, считая его за способ объединения, а оно вон как ! :-)

Неактивен

 

#5 16.10.2016 19:06:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: LEFT JOIN с условием для правой таблицы

Орловчане - редкие гости. Вы, емнип, второй. Или остальные шифровались.

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, то получите разный результат.

Неактивен

 

#6 16.10.2016 19:35:02

Larush
Участник
Зарегистрирован: 16.10.2016
Сообщений: 7

Re: LEFT JOIN с условием для правой таблицы

Спасибо, пока не переварил (а может уже и вечер)... Я тут переделываю себе небольшой сайтик, ну и как водится, небольшие улучшения выливаются в глобальные проблемы... Подскажите, пожалуйста еще один запрос. Опять 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 записи.

Если неправильно построены таблицы (концептуально)- буду рад совету, переделаю.

Неактивен

 

#7 16.10.2016 21:18:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: LEFT JOIN с условием для правой таблицы

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, то запрос нужно будет усложнять.

Неактивен

 

#8 16.10.2016 21:29:52

Larush
Участник
Зарегистрирован: 16.10.2016
Сообщений: 7

Re: LEFT JOIN с условием для правой таблицы

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 не доступны всем остальным. Сам же он может читать все другие "открытые для чтения" записи, как и другие пользователи могут читать его комменты по другим, "не закрытым" фотографиям.

Неактивен

 

#9 16.10.2016 22:16:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: LEFT JOIN с условием для правой таблицы

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 текущего пользователя, чтобы тому кто запретил показывались его собственные запрещенные комментарии.

Неактивен

 

#10 17.10.2016 18:26:04

Larush
Участник
Зарегистрирован: 16.10.2016
Сообщений: 7

Re: LEFT JOIN с условием для правой таблицы

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)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson