Вопрос по сложному запросу SQL


Dram
318

Составил запрос

SELECT t1.id,t1.name,t3.shortname,t3.lastname,t3.firstname,t3.middlename,t4.name as spec,t6.name as city,t7.name as citySpec,t8.street_address,

t1.average,t1.comments,t1.vote,t1.rate,t5.created

FROM xyf_items as t1

LEFT JOIN xyf_city as t6 on t6.id = t1.city_id

LEFT JOIN xyf_address as t8 on t8.item_id = t1.id

LEFT JOIN xyf_working as t2 on t2.firm_id = t1.id

LEFT JOIN xyf_spec as t3 on t3.id = t2.item_id and t3.fullname not LIKE ‘%.%’ and t3.category_id =99

LEFT JOIN xyf_categories as t4 on t4.id = t3.category_id

LEFT JOIN xyf_sections as t7 on t7.id = t3.section_id

LEFT JOIN xyf_comments_items as t5 on (t5.object_id = t1.id and t5.id = (SELECT max(id) FROM xyf_comments_items WHERE `object_id` = t1.id and object_group = ‘com_firms’))

WHERE t1.comments <=9

and t1.group_id = 1

GROUP BY t1.id

И не могу понять. Проблема в строчке

LEFT JOIN xyf_spec as t3 on t3.id = t2.item_id and t3.fullname not LIKE ‘%.%’ and t3.category_id =99

В итоговую выборку не попадают работники фирмы из 99 категории, хотя они там точно есть.

Не могу понять почему?

P.S. т.е. для некоторых фирм они попадают в выборку, а для других нет (хотя для тех что нет, они там точно есть)

начинаю проверять, делаю запрос

SELECT * FROM `xyf_working` WHERE `firm_id` = 1217

и вижу айди 10 работников этой фирмы, все правильно. Несколько их них относятся к 99 категории.

Далее подключаю таблицу самих спецов

SELECT *

FROM `xyf_spec` as t1

LEFT JOIN xyf_working as t2 on t2.item_id = t1.id and t1.fullname not LIKE ‘%.%’ and t1.category_id =99

WHERE t2.firm_id = 1217

и опять все верно, вижу работников 99 категории из фирмы, которых почему то не показывает 1 запрос

Так почему первых запрос их не выводит?

———- Добавлено 15.03.2020 в 11:03 ———-

Я так понимаю дело в LEFT JOIN, оно игнорирует почему то t3.fullname not LIKE ‘%.%’ and t3.category_id =99 м все равно выдает все возможные варианты t3.id = t2.item_id. Но LEFT JOIN мне реально нужен, потому что есть варианты фирм вообще без работников и они нужны в выборке


Dram

Кажется понял, нужно условие опустить в WHERE и сделать так

WHERE t1.comments <=9

and t1.group_id = 1

and ((t3.fullname not LIKE ‘%.%’ and t3.category_id =99) or (t3.fullname is NULL and t3.category_id is NULL))

GROUP BY t1.id


wicker

да верно. не нужно через AND добавлять условия к ON.

все условия к получившейся после JOIN’ов выборке запихнуть в WHERE

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *