簡體   English   中英

mySQL GROUP_CONCAT - 查詢

[英]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;

SqlFiddleDemo

但它會比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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM