Mysql Left join с is null и доп условием не работает

kimisa

Новичок
Не могу понять почему не работает
Код:
SELECT elem.`ID`, elem.`NAME`, elem.`IBLOCK_ID`, elem.`IBLOCK_SECTION_ID`,
prop1.`IBLOCK_PROPERTY_ID`, prop1.`IBLOCK_ELEMENT_ID`
FROM `b_iblock_element` AS elem
LEFT JOIN `b_iblock_element_property` prop1 ON elem.`ID`=prop1.`IBLOCK_ELEMENT_ID`
WHERE elem.`ID` IN (
SELECT `ID`
FROM `b_iblock_element`
WHERE `IBLOCK_ID`=15 AND `IBLOCK_SECTION_ID`=180
) AND prop1.`IBLOCK_PROPERTY_ID` IS NULL
LIMIT 20
Хотя так работает
Код:
SELECT elem.`ID`, elem.`NAME`, elem.`IBLOCK_ID`, elem.`IBLOCK_SECTION_ID`,
prop1.`IBLOCK_PROPERTY_ID`, prop1.`IBLOCK_ELEMENT_ID`
FROM `b_iblock_element` AS elem
LEFT JOIN `b_iblock_element_property` prop1 ON elem.`ID`=prop1.`IBLOCK_ELEMENT_ID`
WHERE prop1.`IBLOCK_PROPERTY_ID` IS NULL
LIMIT 20
Почему как только добавляю доп условие в where, то сразу 0 строк
Хотя на 100% есть такие записи в таблице b_iblock_element, id которых нет в b_iblock_element_property
 

kimisa

Новичок
А вообще мне нужно объединить 2 таблицы b_iblock_element и b_iblock_element_property. Но где нет записей в b_iblock_element_property нужно чтобы выдал нули. Т.е. при условии, что IBLOCK_PROPERTY_ID рано определенному значению или просто нет такой записи для `b_iblock_element`.`ID`. Если равно определенному значинию, то выборка идет:

Код:
SELECT `b_iblock_element`.`ID`, `b_iblock_element`.`NAME`, `b_iblock_element`.`IBLOCK_ID`, `b_iblock_element`.`IBLOCK_SECTION_ID`,
`b_iblock_element_property`.`IBLOCK_PROPERTY_ID`, `b_iblock_element_property`.`IBLOCK_ELEMENT_ID`
FROM `b_iblock_element`
LEFT JOIN `b_iblock_element_property` ON `b_iblock_element`.`ID`=`b_iblock_element_property`.`IBLOCK_ELEMENT_ID`
WHERE `b_iblock_element`.`IBLOCK_ID`=15 AND `b_iblock_element`.`IBLOCK_SECTION_ID`=180
AND `b_iblock_element_property`.`IBLOCK_PROPERTY_ID`=(SELECT `ID` FROM `b_iblock_property` WHERE `CODE`='SKU' AND `IBLOCK_ID`=15)
LIMIT 40;
Но мне нужно найти и те строки с `b_iblock_element`.`ID, которых нет в таблице b_iblock_element_property. реально ли это сделать одним запросом?
 

kimisa

Новичок
Если переношу условие `b_iblock_element`.`IBLOCK_ID`=15 AND `b_iblock_element`.`IBLOCK_SECTION_ID`=180 в ON, то оно просто не работает, как быд-то его нет
 

Фанат

oncle terrible
Команда форума
Еще бывает что мускуль самовольно переписывает лефт на иннер.
запусти в консоли сначала
EXPLAIN твой запрос
а потом
show warnings;
 

kimisa

Новичок
Я реализовала по другому.
Код:
SELECT elem.`ID`, elem.`NAME`, elem.`IBLOCK_ID`, prop1.`VALUE`, enum.`VALUE`
FROM `b_iblock_element` AS elem
LEFT JOIN `b_iblock_element_property` prop1 ON elem.`ID`=prop1.`IBLOCK_ELEMENT_ID`
LEFT JOIN `b_iblock_element_property` prop2 ON elem.`ID`=prop2.`IBLOCK_ELEMENT_ID`
LEFT JOIN `b_iblock_property_enum` enum ON enum.`ID`=prop2.`VALUE`
WHERE elem.`IBLOCK_ID`=16
AND prop1.`IBLOCK_PROPERTY_ID`=(SELECT `ID` FROM `b_iblock_property` WHERE `CODE`='CML2_LINK' AND `IBLOCK_ID`=16)
AND prop2.`IBLOCK_PROPERTY_ID`=(SELECT `ID` FROM `b_iblock_property` WHERE `CODE`='TSVET' AND `IBLOCK_ID`=16)
AND prop1.`VALUE` IN (
SELECT elem.`ID`
FROM `b_iblock_element` AS elem
LEFT JOIN `b_iblock_element_property` prop1 ON elem.`ID`=prop1.`IBLOCK_ELEMENT_ID`
WHERE elem.`IBLOCK_ID`=15 AND elem.`IBLOCK_SECTION_ID`=180
AND prop1.`IBLOCK_PROPERTY_ID`=(SELECT `ID` FROM `b_iblock_property` WHERE `CODE`='SKU' AND `IBLOCK_ID`=15)
)
LIMIT 20;
В итоге получилась таблица https://yadi.sk/i/C3E5X9Om3GVb58
Только не соображу как сгруппировать по последнему столбцу. Т.е. чтобы объединились одинаковые поля. По enum.`VALUE` не работает
 
Сверху