查找具有多个唯一值的列

时间:2018-05-23 07:00:33

标签: mysql

我有一个名为fruits的表,如下所示:

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| worm_id         | int(11)      | YES  | MUL | NULL    |                |
| event_id        | varchar(15)  | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

表中的值如下所示:

+----------+-------------+-----------------+
| id       | worm_id     | event_id        |
+----------+-------------+-----------------+
|       12 |         134 | 1468036258-1426 |
|       13 |         134 | 1468036258-1426 |
|       14 |         134 | 1468036258-1426 |
|       15 |        NULL | 1468036258-1426 |
|       16 |         135 | 1468036258-1426 |
|       17 |         135 | 1468036258-1426 |
|       18 |         135 | 1468036258-1426 |
|       19 |        NULL | 1468036258-1426 |
|       20 |         134 | 1468102511-5892 |
|       21 |         134 | 1468102511-5892 |
|       22 |        NULL | 1468102511-5892 |
|       23 |         136 | 1468228612-9272 |
|       24 |         136 | 1468228612-9272 |
|       25 |        NULL | 1468228612-9272 |
+----------+-------------+-----------------+

在每个事件ID下,可能有许多带有单个worm_id的条目(例如134,135等),有时还有一些空条目。

在我的一些条目中 - 由于底层应用程序中的错误 - 在一个event_id中使用了两个唯一的worm_id(如event_id 1468036258-1426)。

我正在尝试构建一个查询,以便在方案中显示一个event_id列表,在单个event_id下有多个唯一的数字worm_id。

这是我到目前为止所提出的:

SELECT DISTINCT(worm_id), event_id FROM `fruits`
WHERE worm_id IS NOT NULL
AND event_id = '1468036258-1426'
ORDER BY event_id DESC

返回以下结果:

+-------------+-----------------+
| worm_id     | event_id         |
+-------------+-----------------+
|         134 | 1468036258-1426 |
|         135 | 1468036258-1426 |
+-------------+-----------------+

我想大规模地执行此操作并返回如下所示的结果:

+-----------------+-----------------+
| event_id        | worm_ids        |
+-----------------+-----------------+
| 1468036258-1426 | 134,135         |
+-----------------+-----------------+

1 个答案:

答案 0 :(得分:1)

使用group_concat

SELECT 
  GROUP_CONCAT(DISTINCT worm_id) AS worm_ids,
  event_id 
FROM
  `fruits` 
WHERE worm_id IS NOT NULL 
  AND event_id = '1468036258-1426' 

Demo

要查看所有事件的蠕虫ID,您需要按事件ID

对数据进行分组
SELECT 
  GROUP_CONCAT(DISTINCT worm_id) AS worm_ids,
  event_id 
FROM
  `fruits` 
WHERE worm_id IS NOT NULL 
GROUP BY event_id 

Demo

如果要查看具有1个以上不同蠕虫ID的所有事件,您还可以对聚合结果集应用过滤器

SELECT 
  GROUP_CONCAT(DISTINCT worm_id) AS worm_ids,
  event_id 
FROM
  `fruits` 
WHERE worm_id IS NOT NULL 
GROUP BY event_id 
HAVING COUNT(DISTINCT worm_id) > 1 

Demo