Как сделать этот запрос MySQL? (как получить n полей в 1 строку) - PullRequest
0 голосов
/ 21 марта 2009

После предыдущего вопроса ( Как выполнить этот запрос в Mysql? )

Допустим, у меня есть сообщение:

Id: 1, Message: This is a message

2 предмета:

Id:1, Subject: Math
Id:2, Subject: Science
Id:3, Subject: Numbers

И есть 2 записи message_subject_rel, которые идут:

Id: 1, message_id: 1, subject_id: 1
Id: 2, message_id: 1, subject_id: 2
Id: 3, message_id: 1, subject_id: 3

Я хотел сделать запрос, чтобы выбрать сообщения, которые содержали математику и естествознание в качестве тем, которые я в итоге использовал:

SELECT m.*
FROM messages m
 JOIN message_subject_rel ms1 ON (m.id = ms1.message_id)
 JOIN subjects s1 ON (ms1.subject_id = s1.id AND s1.subject = 'Math')
 JOIN message_subject_rel ms2 ON (m.id = ms1.message_id)
 JOIN subjects s2 ON (ms2.subject_id = s2.id AND s2.subject = 'Science');

Теперь очень ясно, что я хотел бы показать сообщение (потому что оно имеет эти 2 темы), а также сказать пользователю, что у него нет ТОЛЬКО этих 2 тем, но на самом деле есть 3, и не только что ... я хотел бы напечатать 3 темы (конечно, у меня есть много сообщений и я хотел бы фактически перечислить их, с их соответствующими темами только в 1 запросе). Я не могу понять, если это возможно на самом деле только с одним запросом, так как я бы получить n "субъект" поле в качестве возврата.

Есть идеи, если это можно сделать всего одним запросом, и если да, то как?

TY

Ответы [ 2 ]

2 голосов
/ 21 марта 2009

См. GROUP_CONCAT для одного решения. Однако я не знаю, насколько эффективен этот подход.

select message.Id as id, Message, group_concat(Subject separator ';') as subjects
from message,subject,message_subject_rel
where message.Id=message_subject_rel.message_id
  and subject.Id=message_subject_rel.subject_id
group by message.Id
having subjects like '%Math%' and subjects like '%Science%';

Из этого я получаю:

+------+---------+----------------------+
| id   | Message | subjects             |
+------+---------+----------------------+
|    1 | Message | Math;Science;Numbers | 
+------+---------+----------------------+

Очевидно, вы могли бы сделать лучше, чем мой ';' разделитель и мои подобные предложения.

0 голосов
/ 21 марта 2009

Вы пробовали GROUP_CONCAT?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...