Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL组\u CONCAT-查询_Mysql_Sql_Database - Fatal编程技术网

mySQL组\u CONCAT-查询

mySQL组\u CONCAT-查询,mysql,sql,database,Mysql,Sql,Database,我几乎可以从sql查询中得到我所需要的,但还不能完全得到,我希望能得到一些帮助 我有以下三个表格: people +----+-------------------------+ | id | email | +----+-------------------------+ | 1 | joe_soap@hotmail.com | | 2 | john_doe@hotmail.com | | 3 | fred_bloggs@hotmail.

我几乎可以从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 |
+----+-------------------------+----------------------------+
+----+-------------------------+----------------------------+
| id |         email           | GROUP_CONCAT               |
+----+-------------------------+----------------------------+
|  1 | joe_soap@hotmail.com    | Plumber, 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         |
|  2 | john_doe@hotmail.com    | Carpenter                  |
|  3 | fred_bloggs@hotmail.com | Plumber, Carpenter,Builder |
+----+-------------------------+----------------------------+
+----+-------------------------+----------------------------+
| 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
拥有
筛选出至少一个工作描述不等于
管道工
的人员组,而
其中
每行操作,排除所有工作描述不等于
管道工
的人员组


您可以使用子查询包装第一个查询,并使用
在集合中查找:

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;


但这比使用
方法回答问题要慢。

在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;

此外,您可能不需要
组_CONCAT()
中的
不同的
,除非您的表有重复项。

我在
的情况下更正了键入错误。如果有人想玩,请演示it@lad2025非常感谢您的帮助。@Giorgos Betsos非常感谢您继续我的教育。似乎对我来说,SQL总是有一些新的东西需要学习。