skoder
@skoder
web программист

Почему не верно работает mysql left join?

Добрый день
Есть две таблицы
plugins
id name
1   first
2   second

и images
id pluginid image
1  1            1.jpg
2  1            4.png
3  2            10.png

Далее нужно вытянуть все плагины с их первыми фото. делаю такой запрос
select jp.*, ji.image
from jml_jquery_plugins as jp 
left join jml_jquery_images as ji 
	on ji.pluginid=jp.id 
where jp.del<>1 and jp.lastupdate>0 
order jp.name asc 
limit 20


в результате, запрос возвращает все записи из таблицы plugins, дублированные с таблицей images. Т.е. декартово произведение
id name image
1   first  1.jpg
1   first  4.png
2   second 10.png


ведь left join должен работать не так

на данный момент работает точно также как
select jp.*, ji.image
from jml_jquery_plugins as jp , jml_jquery_images as ji 
where jp.del<>1 and jp.lastupdate>0  and ji.pluginid=jp.id
order jp.name asc 
limit 20
  • Вопрос задан
  • 2905 просмотров
Пригласить эксперта
Ответы на вопрос 3
mr_T
@mr_T
Web-разработчик
Точно именно декартово произведение? Тогда должно вернуться 6 строк, но это если бы не было условия ON, у тебя же оно есть и составлено вроде бы правильно.
У тебя тут по идее должно вернуться 3 строки, по одной на каждый найденный image. Данные будут дублироваться в данном случае только для pluginid = 1, так как там 2 картинки, и это нормально. Чтобы этого избежать, можно добавить GROUP BY jp.id и SELECT GROUP_CONCAT(ji.image SEPARATOR ',') as images, тогда у тебя вернется строка с картинками через запятую и количество строк на выходе будет равным количеству plugins.
Ответ написан
@PedroGarciyaLopez
попробуй так
SELECT DISTINCT имя(имена)_колонки FROM имя_таблицы

xml.nsu.ru/sql/sql_distinct.xml
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Всё верно возвращает, для каждой строки первой таблицы выбираются все подходящие строки второй таблицы или NULL, если они отсутствуют.
SELECT `jp`.*, `ji`.`image`
  FROM `jml_jquery_plugins` AS `jp`
  LEFT JOIN `jml_jquery_images` as `ji` 
    ON `ji`.`pluginid` = `jp`.`id`
  LEFT JOIN (SELECT MIN(`id`) AS `min`, `pluginid` FROM `jml_jquery_images` GROUP BY `pluginid`) AS `t`
    ON `t`.`pluginid` = `jp`.`id`
  WHERE `jp`.`del` != 1 
    AND `jp`.`lastupdate` > 0 
    AND (`t`.`min` = `ji`.`id` OR `ji`.`image` IS NULL)
  ORDER `jp`.`name` ASC
  LIMIT 20
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы