В одном запросе MySQL выберите несколько строк из одной таблицы, каждая из которых содержит несколько строк из таблицы ссылок - PullRequest
1 голос
/ 10 сентября 2010

Есть две таблицы с таблицей связей между ними.


USERS
+-------+---------+
| userID| Username|
+-------+---------+
|     1 |  Nate   | 
|     2 |  Nic    | 
|     3 |  John   | 
+-------+---------+

SITES
+--------+---------+
| siteID | Site    |
+--------+---------+
|     1  |  art    | 
|     2  |  com    | 
|     3  |  web    | 
+--------+---------+

USER_SITES
+-------------+---------+---------+
| user_site_id| user_id | site_id |
+-------------+---------+---------+
|     1       |  1      | 1       |
|     2       |  1      | 2       |
|     3       |  1      | 3       |
|     4       |  2      | 2       |
|     5       |  2      | 3       |
+-------------+---------+---------+

Я хочу сделать один запрос, который будет выводить как это


USERS
+---------+----------------+
| username| sites          |
+---------+----------------+
|  Nate   |  art, com, web | 
|  Nic    |  com, web      | 
+---------+----------------+

Можно ли это легко сделать одним запросом? Я бы хотел сделать это в MySQL и POSTgreSQL, но я возьму все, что смогу!

1 Ответ

2 голосов
/ 10 сентября 2010

Это можно сделать в MySQL, используя GROUP_CONCAT :

SELECT
    username,
    GROUP_CONCAT(Site ORDER BY Site SEPARATOR ', ') AS sites
FROM USER_SITES
JOIN USERS ON USER_SITES.user_id = USERS.userID
JOIN SITES ON USER_SITES.site_id = SITES.siteID
GROUP BY username

Результат:

+---------------------------+
| username  | sites         |
+---------------------------+
| Nate      | art, com, web |
| Nic       | com, web      |
+---------------------------+

Чтобы увидеть, как эмулировать GROUP_CONCAT в PostgreSQL, посмотрите этот вопрос:

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