Вам нужна функция агрегации, чтобы работать с такого рода группировкой. Я не очень хорошо разбираюсь в 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 |
+----------------------+-------+