[英]mySQL GROUP_CONCAT - Query
我幾乎可以得到我所需要的,從一個SQL查詢但不完全,我會很感激一些幫助。
我有以下三個表:
people
+----+-------------------------+
| id | email |
+----+-------------------------+
| 1 | joe_soap@hotmail.com |
| 2 | john_doe@hotmail.com |
| 3 | fred_bloggs@hotmail.com |
+----+-------------------------+
jobs
+----+-------------+
| id | description |
+----+-------------+
| 1 | Plumber |
| 2 | Plasterer |
| 3 | Carpenter |
| 4 | Builder |
+----+-------------+
people_jobs
+-----------+--------+
| person_id | job_id |
+-----------+--------+
| 1 | 1 |
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
| 3 | 1 |
| 3 | 4 |
+-----------+--------+
使用此查詢,我可以以我需要的格式輸出所有數據:
SELECT people.id, people.email,
GROUP_CONCAT(DISTINCT jobs.description
ORDER By jobs.description DESC SEPARATOR ', ')
FROM jobs
INNER JOIN people_jobs On people_jobs.job_id = jobs.id
INNER JOIN people On people.id = people_jobs.person_id
GROUP BY people.id
如下:
+----+-------------------------+----------------------------+
| id | email | GROUP_CONCAT |
+----+-------------------------+----------------------------+
| 1 | joe_soap@hotmail.com | Plumber, Carpenter |
| 2 | john_doe@hotmail.com | Carpenter |
| 3 | fred_bloggs@hotmail.com | Plumber, Carpenter,Builder |
+----+-------------------------+----------------------------+
通過添加WHERE子句,我可以為所有可以執行特定工作的人員輸入:
SELECT people.id, people.email,
GROUP_CONCAT(DISTINCT jobs.description
ORDER By jobs.description DESC SEPARATOR ', ')
FROM jobs
INNER JOIN people_jobs On people_jobs.job_id = jobs.id
INNER JOIN people On people.id = people_jobs.person_id
WHERE jobs.description = 'Plumber'
GROUP BY people.id
+----+-------------------------+--------------+
| id | email | GROUP_CONCAT |
+----+-------------------------+--------------+
| 1 | joe_soap@hotmail.com | Plumber |
| 3 | fred_bloggs@hotmail.com | Plumber |
+----+-------------------------+--------------+
我想要實現的是上述輸出加上人們可以做的其他工作如下:
+----+-------------------------+----------------------------+
| id | email | GROUP_CONCAT |
+----+-------------------------+----------------------------+
| 1 | joe_soap@hotmail.com | Plumber, Carpenter |
| 3 | fred_bloggs@hotmail.com | Plumber, Carpenter,Builder |
+----+-------------------------+----------------------------+
有人可以幫忙嗎?
改為使用HAVING
子句:
SELECT people.id, people.email,
GROUP_CONCAT(DISTINCT jobs.description
ORDER By jobs.description DESC SEPARATOR ', ')
FROM jobs
INNER JOIN people_jobs On people_jobs.job_id = jobs.id
INNER JOIN people On people.id = people_jobs.person_id
GROUP BY people.id
HAVING COUNT(CASE WHEN jobs.description = 'Plumber' THEN 1 END) >= 1
HAVING
過濾掉人群不具有至少一個職位描述等於'Plumber'
,而WHERE
每行工作,但不包括沒有工作描述等於所有行 'Plumber'
。
您可以使用子查詢包裝第一個查詢並使用FIND_IN_SET
:
SELECT *
FROM (
SELECT people.id, people.email,
GROUP_CONCAT(DISTINCT jobs.description
ORDER By jobs.description DESC SEPARATOR ', ') AS jobs
FROM jobs
JOIN people_jobs On people_jobs.job_id = jobs.id
JOIN people On people.id = people_jobs.person_id
GROUP BY people.id) AS sub
WHERE FIND_IN_SET('Plumber', sub.jobs) > 0;
但它會比Giorgos Betsos回答中的HAVING
方法慢。
在MySQL中,您可以添加一個簡單的having
子句,類似於where
子句:
SELECT p.id, p.email,
GROUP_CONCAT(DISTINCT j.description ORDER By j.description DESC SEPARATOR ', ')
FROM jobs j INNER JOIN
people_jobs pj
On pj.job_id = j.id INNER JOIN
people p
On p.id = pj.person_id
GROUP BY p.id
HAVING SUM(j.description = 'Plumber') > 0;
此外,您可能不需要GROUP_CONCAT()
的DISTINCT
,除非您的表有重復項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.