Как это сделать в SQL-запросе? - PullRequest
2 голосов
/ 19 августа 2011
Table: A                  Table: B                 Table: C
------------            ----------------          -------------
P_id | G_id              P_id  |  Name            G_id | Title
------------            ----------------          -------------
 1   |  1                 1    | john              1   | php
 2   |  1                 2    | jack              2   | sql
 3   |  2                 3    | sam

Теперь я спрашиваю, как:

Select B.name, C.title
from B inner join A on...
inner join c on...

Если мы введем здесь john, он будет отображаться так:

john php.

Но я хочу отобразить это как:

john jack  php.   

Потому что G_id Джона и Джека одинаковы.
Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Вам нужна функция агрегации, чтобы работать с такого рода группировкой. Я не очень хорошо разбираюсь в MySQL, но попробую что-то вроде этого, используя функцию group_concat ():

select
    group_concat(b.Name),
    c.Title
from
    A a
    join B b on b.P_id = a.P_id
    join C c on c.G_id = a.G_id
group by
    c.Title

Надеюсь, он покажет вам "Джон, Джек"

Проверьте документы о функциях агрегирования здесь: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

- РЕДАКТИРОВАТЬ

Только что проверил, он дал мне следующий вывод:

+----------------------+-------+
| group_concat(b.Name) | Title |
+----------------------+-------+
| john,jack            | php   |
| sam                  | sql   |
+----------------------+-------+

Я надеюсь, что это то, что вы хотите:)

- РЕДАКТИРОВАТЬ (последний)

Теперь я думаю, что понял, что вы хотите, просто добавьте having group_concat(b.Name) like '%john%', и он даст вам только те группы, в которые входит john ... Лучшим выбором была бы функция array contains, но я не не нашел его.

+----------------------+-------+
| group_concat(b.Name) | Title |
+----------------------+-------+
| john,jack            | php   |
+----------------------+-------+
1 голос
/ 19 августа 2011

Псевдокод (похожий на mysql):

SELECT B.name, C.title 
FROM B
INNER JOIN A ON A.P_id = B.P_id
INNER JOIN C ON A.G_id = C.G_id
WHERE A.G_id = (
                 SELECT A.G_id 
                 FROM B
                 INNER JOIN A ON A.P_id = B.P_id
                 WHERE B.Name LIKE '%John%' LIMIT 1
               );

РЕДАКТИРОВАТЬ:

Это сделает ваши результаты поиска по имени, используйте GROUP_CONCAT и GROUP BY, как предложено Эвертон Агнер для правильного форматирования результатов.

...