如何通过查询查找MySQL组中的唯一值?
MySQL表:数字 在此表中,ID是主键。NUM是随机值,CREATED是日期 我的问题是: 我的查询结果: 但我的预期结果是: 2018-03月的UniqueNum结果应为0。因为NUM 11在2018-01月已经存在。而且 2018-05月的UniqueNum结果应为0。因为2018-02月已经存在NUM 22如何通过查询查找MySQL组中的唯一值?,mysql,Mysql,MySQL表:数字 在此表中,ID是主键。NUM是随机值,CREATED是日期 我的问题是: 我的查询结果: 但我的预期结果是: 2018-03月的UniqueNum结果应为0。因为NUM 11在2018-01月已经存在。而且 2018-05月的UniqueNum结果应为0。因为2018-02月已经存在NUM 22 我想找到每个月的唯一号码。如何通过更新MySQL查询获得预期结果?请提供帮助。您只需将表本身连接起来,然后只返回以前创建日期不存在的数字即可 SELECT DATE_FORMAT
我想找到每个月的唯一号码。如何通过更新MySQL查询获得预期结果?请提供帮助。您只需将表本身连接起来,然后只返回以前创建日期不存在的数字即可
SELECT
DATE_FORMAT(n.CREATED,'%Y-%m') AS Month,
COUNT(n.NUM) AS TotalNum,
COUNT(un.NUM) AS UniqueNum
FROM
`numbers` n
LEFT JOIN (SELECT ID, NUM FROM numbers n1 WHERE NOT EXISTS (SELECT 1 FROM numbers n2 WHERE n1.NUM = n2.NUM AND n2.CREATED < n1.CREATED)) un ON n.ID = un.ID
GROUP BY
DATE_FORMAT(n.CREATED,'%Y-%m')
现场观看它的工作
通常对我有效的解决方案是嵌套查询 希望这有帮助
SELECT
Month,
SUM(NUMCNT) AS TotalNum,
COUNT(NUM) AS UniqueNum
FROM
(
SELECT
DATE_FORMAT(CREATED,'%Y-%m') AS Month,
NUM,
COUNT(NUM) AS NUMcnt
FROM
`numbers`
GROUP BY
Month,
NUM
) a
;
非常感谢您的回答。当行数超过5K时,此查询花费的时间太长。有没有其他方法可以加快查询速度?请在另一个问题中提出这个问题。包括以下查询的结果:显示创建表编号\G,解释,从数字中显示索引;现在,通过向NUM字段添加索引,问题得到了解决。谢谢你
+---------+----------+-----------+
| Month | TotalNum | UniqueNum |
+---------+----------+-----------+
| 2018-01 | 1 | 1 |
+---------+----------+-----------+
| 2018-02 | 1 | 1 |
+---------+----------+-----------+
| 2018-03 | 1 | 1 |
+---------+----------+-----------+
| 2018-04 | 2 | 1 |
+---------+----------+-----------+
| 2018-05 | 1 | 1 |
+---------+----------+-----------+
+---------+----------+-----------+
| Month | TotalNum | UniqueNum |
+---------+----------+-----------+
| 2018-01 | 1 | 1 |
+---------+----------+-----------+
| 2018-02 | 1 | 1 |
+---------+----------+-----------+
| 2018-03 | 1 | 0 |
+---------+----------+-----------+
| 2018-04 | 2 | 1 |
+---------+----------+-----------+
| 2018-05 | 1 | 0 |
+---------+----------+-----------+
SELECT
DATE_FORMAT(n.CREATED,'%Y-%m') AS Month,
COUNT(n.NUM) AS TotalNum,
COUNT(un.NUM) AS UniqueNum
FROM
`numbers` n
LEFT JOIN (SELECT ID, NUM FROM numbers n1 WHERE NOT EXISTS (SELECT 1 FROM numbers n2 WHERE n1.NUM = n2.NUM AND n2.CREATED < n1.CREATED)) un ON n.ID = un.ID
GROUP BY
DATE_FORMAT(n.CREATED,'%Y-%m')
SELECT
Month,
SUM(NUMCNT) AS TotalNum,
COUNT(NUM) AS UniqueNum
FROM
(
SELECT
DATE_FORMAT(CREATED,'%Y-%m') AS Month,
NUM,
COUNT(NUM) AS NUMcnt
FROM
`numbers`
GROUP BY
Month,
NUM
) a
;