如何通过查询查找MySQL组中的唯一值?

如何通过查询查找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表:数字

在此表中,ID是主键。NUM是随机值,CREATED是日期

我的问题是:

我的查询结果:

但我的预期结果是:

2018-03月的UniqueNum结果应为0。因为NUM 11在2018-01月已经存在。而且 2018-05月的UniqueNum结果应为0。因为2018-02月已经存在NUM 22


我想找到每个月的唯一号码。如何通过更新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
;