2014-02-10 2 views
0

У меня есть 2 таблицымного для многих запросов возврата тузд повторяющихся строк

1 ресурсы

id | name | type 
1 | X | form 
2 | YY | post 
3 | ZZ | container 

2 res_res

id | parent_id | son_id 

1 | 1  | 2 
2 | 3  | 1 

теперь я хочу, чтобы выбрать ресурс. *, Res_res.id из все ресурсы, связанные с идентификатором ресурса (1)

ожидаемый результат

link_id | id | name | type | 
1  | 2 | YY | post | 
2  | 3 | ZZ | container 

мой запрос

1:

SELECT distinct r.* FROM `resources` as r 
join res_res as l on (l.parent_id=r.id or l.son_id=r.id) 
where l.parent_id = 2 or l.son_id = 2 

этот запуск запроса, как ожидается, и возвращать результат я хочу, за исключением того, что она не включает идентификатор или ссылку (ID из resource_resource таблицы), но если я запускаю это

2:

SELECT distinct l.id as link_id,r.* FROM `resources` as r 
join res_res as l on (l.parent_id=r.id or l.son_id=r.id) 
where l.parent_id = 2 or l.son_id = 2 

это возвращает столько повторяющихся строк; так что я делаю неправильно?

У меня проблема в том, что мое условие соединения возвращает идентификатор parent-id и son-id при совпадении строки, поэтому происходит дублирование, мне нужно поместить случай if в select, чтобы выбрать только другое поле.

есть ли лучший способ выбрать все ресурсы, связанные с resource.id X, и включить идентификатор соединения?

Мне не нравится использовать group_by, потому что он пишет временную. который замедляет мою работу.

благодаря

ответ

0

Ваше условие соединения является неправильным, поскольку это соответствует против элемента сына, даже если родитель является один вам нужно.

SELECT l.id as link_id,r.* 
FROM `resources` as r 
CROSS JOIN res_res as l 
WHERE (l.parent_id = 2 AND l.parent_id=r.id) OR (l.son_id = 2 AND l.son_id=r.id) 
+0

спасибо, но это возвращает только родительскую строку, также дублированную так же, как и количество ее детей; Например, если я запустил его, он вернет строку r.I'd = 2 столько раз, что и одна строка – Zalaboza

+0

Выберите l.Id, r. * из ресурсов как r cross join red_res as l on (l.parent = 2 и l .son_id = r.I'd) или (l.son_id = 2 и l.parent_id = r.id) Works :) спасибо – Zalaboza

1

Возможно используют UNION вместо: -

SELECT l.id AS link_id, l.son_id AS id, r.name, r.type 
FROM `resources` AS r 
INNER JOIN res_res AS l ON l.parent_id = r.id 
WHERE l.son_id = 1 
UNION 
SELECT l.id AS link_id, l.parent_id AS id, r.name, r.type 
FROM `resources` AS r 
INNER JOIN res_res AS l ON l.son_id = r.id 
WHERE l.parent_id = 1 
+0

Я думаю, что моя проблема в том, что мне нужно, если parent_I'd = 2 выберите son_id еще, если son_I'd = 2 выберите parent_I'd это удалит duplicats – Zalaboza

+0

Это то, что это делает. Первый выбор получает все записи res_res для id 1, где родительский номер равен 1, а другой получает их, где идентификатор сына равен 1. Предполагая уникальные записи в res_res, не должно быть дубликатов. Он избегает OR в условии соединения, который будет неэффективным. – Kickstart

Смежные вопросы