У меня есть задача, связанная со сложным запросом JOIN.

Таблица 1: объект_категория (древовидная структура для иерархии родительской категории и дочерней категории)

----------------------
category_id parent_id
----------------------
1           null
2           null
3           1
4           1
5           2
6           2
----------------------

Обратите внимание, что категория 3 - это ребенок 1, 5 - ребенок 2 и т. Д.

Таблица 2: object_category_map (таблица для сопоставления object_id с category_id таблицы object_category)

----------------------
object_id  category_id
----------------------
23          1
23          4
23          6
24          2
24          5
----------------------

Задача состоит в том, чтобы найти object_id, для которого не сопоставлен parent_id для category_id.

Пример1: object_id: 24, category_id: 2, 5 в таблице 2 object_id 24 связан с category_id 5, а также parent_id 5, это 2,

Пример2: object_id: 23, category_id: 1, 4, 6 object_id 23 отсутствует parent_id (2) для category_id 6.

Задача состоит в том, чтобы найти 23, то есть список object_id (ов) из таблицы2, которые соответствуют ситуации 23.

Любезно помогите решить это. Спасибо.

2
Mohan Babu 21 Янв 2014 в 11:22
Во-первых, то, что вы пытаетесь достичь, - это концепция иерархии узлов, здесь вы можете использовать СОЕДИНЕНИЯ на фиксированном уровне, скажем, на родительском уровне до 2, поэтому вы можете сделать до 3 соединений, но что, если иерархия родительских узлов продолжает увеличиваться ? Поэтому для этого вам нужно будет пройти обратно по иерархии узлов, пока вы не получите parent_id как NULL. Для этого вам потребуются усилия по программированию + усилия по SQL-запросу и использование рекурсивной функции до тех пор, пока вы не получите parent_id как NULL. Какой язык вы используете, чтобы я мог указать правильный пример
 – 
rsakhale
21 Янв 2014 в 11:42
Я использую PHP с Mysql
 – 
Mohan Babu
21 Янв 2014 в 14:06

1 ответ

Лучший ответ

Не могли бы вы попробовать что-нибудь подобное.

select object_parent_needed.object_id
from (
    select object_id,object_category_map.category_id,parent_id
    from object_category_map 
    join object_category on object_category_map.categor_id = object_category.category_id
    where parent_id is not null
) object_parent_needed
left outer join object_category_map on object_category_map.object_id = object_parent_needed.object_id  
                                    and object_category_map.category_id = object_parent_needed.parent_id
where object_category_map.category_id is null
1
dagfr 21 Янв 2014 в 11:43