MySQL JOIN - требуется помощь

LovelAss
На сайте с 05.06.2009
Offline
96
638

Здравствуйте, уважаемые коллеги!

Постараюсь изложить проблему коротко и ясно.

Есть запрос:


SELECT `m`.`id`, `m`.`categories`, `categories`.`name`
FROM `movies` AS `m`
LEFT JOIN `categories` ON `categories`.`id` IN (`m`.`categories`)
WHERE `m`.`id` = '1'

при значении `m`.`id` = '1' поле `m`.`categories` содержит значение 23,2 - следуя логике, данный запрос должен выводить 2 строки, точно так же, как и запрос:


SELECT `m`.`id`, `m`.`categories`, `categories`.`name`
FROM `movies` AS `m`
LEFT JOIN `categories` ON `categories`.`id` IN (23,2)
WHERE `m`.`id` = '1'

но, вместо этого, выводится одна строка, как будто в условии стоит знак равенства, вместо IN:


LEFT JOIN `categories` ON `categories`.`id` = `m`.`categories`

Пробовал делать выборку с подзапросом:


SELECT `m`.`id`, `m`.`categories`, `categories`.`name`
FROM `movies` AS `m`
LEFT JOIN `categories` ON `categories`.`id` IN
(
SELECT `categories` FROM `movies` WHERE `id` = '1'
)
WHERE `m`.`id` = '1'

в результате так же получаю одну строку, вместо двух.

В чём здесь подвох, кто подскажет? Почему работает запрос с конкретным указанием значений в условии IN и не работают остальные?

RiDDi
На сайте с 06.06.2010
Offline
256
#1

А почему две должно быть? У Вас LEFT и слева (из movies) одна строка и к ней идет внешнее объединение так же из одной строки.

Поставьте RIGHT будет Вам две :)

Вебмастер отдыхает на бережках морей. Заработок в интернете - дело техники.
LovelAss
На сайте с 05.06.2009
Offline
96
#2
RiDDi:
У Вас слева одна строка и к ней идет внешнее объединение так же из одной строки.

В том то и дело, что объединение должно производиться по двум строкам, так как поле `m`.`categories` содержит 2 идентификатора и выборка у нас идёт с условием IN. Второй запрос, при явном указании категорий (23,2), возвращает то, что мне нужно (2 строки), а остальные возвращают одну стоку. Почему так происходит мне не понятно.

RiDDi
На сайте с 06.06.2010
Offline
256
#3

Аа, я вообще про другое подумал ))

Наверно потому, что в IN же ищет по массиву, а не по строке..

Ну то есть Вы передаете не две переменные: '23' и '2', а одну - '23,2'.. Вот он одну строку и выводит..

М
На сайте с 08.02.2006
Offline
59
#4

потому, что с точки зрения SQL в выражении IN() m.categories - это одно строковое значение, а 23,6 - два числовых. Используйте FIND_IN_SET

LovelAss
На сайте с 05.06.2009
Offline
96
#5
Магнат:
потому, что с точки зрения SQL в выражении IN() m.categories - это одно строковое значение, а 23,6 - два числовых.

Вот теперь всё стало мне ясно. Спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий