Php 从表中选择Unique

Php 从表中选择Unique,php,mysql,Php,Mysql,大家好,我有一个mysql数据库表,如下所示 date id name 2012-09-18 1 A 2012-09-18 2 B 2012-09-18 1 C 2012-09-17

大家好,我有一个mysql数据库表,如下所示

      date                  id                   name 

   2012-09-18               1                     A
   2012-09-18               2                     B
   2012-09-18               1                     C
   2012-09-17               1                     D
   2012-09-17               1                     A
   2012-09-17               2                     A
   2012-09-16               1                     A
   2012-09-16               1                     E
ID=1的所需结果

     DATE                  UNIQUES
   2012-09-18               1      
   2012-09-17               1  
   2012-09-16               2  
文字描述

我想按日期分组计算每个id的唯一名称。 如。 对于9月16日,uniques=2,因为在本表中,A、E在9月16日之前不会出现。 对于9月17日,uniques=1,因为在本表中,D在9月17日之前没有出现,而A在9月16日已经出现。

我的建议:

SELECT
`date`,
SUM(CASE WHEN EXISTS(SELECT 1 FROM yourTable u2 WHERE u1.date > u2.date AND u1.name = u2.name) THEN 0 ELSE 1 END) AS uniques
FROM
yourTable u1
WHERE id = 1
GROUP BY 1
SELECT `date`,
       Sum(CASE
             WHEN so_far = 1 THEN 1
             ELSE 0
           end) AS UNIQUES
FROM   (SELECT a.`date`,
               a.id,
               a.name,
               Count(DISTINCT b.`date`) AS so_far
        FROM   srctable AS a
               JOIN srctable AS b
                 ON ( a.id = b.id
                      AND a.name = b.name
                      AND a.`date` >= b.`date` )
        GROUP  BY a.`date`,
                  a.id,
                  a.name) AS tab
WHERE  id=1
GROUP  BY `date` 
因为它不相关,所以应该有相当好的性能

编辑

出于环境的考虑,我修改了我的查询,事实上还有一个有待改进的领域

SELECT a.`date` AS adt,
       Sum(CASE
             WHEN b.`date` IS NULL THEN 1
             ELSE 0
           end) AS unq
FROM   some_table AS a
       LEFT JOIN some_table AS b
              ON ( a.id = b.id
                   AND a.name = b.name
                   AND a.`date` > b.`date` )
WHERE  a.id = 1
GROUP  BY a.`date`,
          a.id;  

如果有疑问,您可以检查并最终与其他建议的解决方案进行比较。

因此,您希望将列表缩减到每个姓名的第一个日期,然后按日期计数姓名
从您的列表中选择计数(问题)。接受的问题=1
返回的信息太少,无法期望得到一个像样的答案,sorry@Nikhil我不明白,首先,这个查询给出了错误的结果,其次,这个查询永远不会像我的查询那么快。你为什么接受它?你们不知道这个网站是怎么工作的吗?是的,这个查询并没有给我提供准确的结果,但通过稍微调整一下,我能够接近我另一个问题的答案。这就是我接受sol的原因。。。我只是忘了提一下…下次我会记住的。。抱歉,伙计们…@Nikhil,这很好,但不应该使用upvots或accepts。upvote的工具提示:“这篇文章很有用”,而接受标记了解决手头问题的答案。你使用它的方式会误导其他新手,他们可能会认为这个答案比我的好,但无意冒犯WojtusJ,这个查询是废话。就像你想用牙刷敲钉子一样。@Nikhil,请告诉我调整的方法,我会纠正我的疑问。@tombom,你听说过哭泣的人很可怜吗?:-)顺便说一句,在子查询中不需要关联的地方使用关联,这是一个业余爱好者的标志,也表明它更好,这表明您完全不知道数据库是如何工作的。更重要的是,-1在我的回答中看起来像是绝望的行为,还说你不知道这些规则。顺便说一句,我真的很抱歉你的回答没有被接受,但是哭可能不会有帮助。:-]+因此,你有一些东西可以证明你的困难,并提供一个更好的答案
create table t (d date, id integer, name varchar(30));

insert into t (d, id, name) values
('2012-09-18', 1, 'A'),
('2012-09-18', 2, 'B'),
('2012-09-18', 1, 'C'),
('2012-09-17', 1, 'D'),
('2012-09-17', 1, 'A'),
('2012-09-17', 2, 'A'),
('2012-09-16', 1, 'A'),
('2012-09-16', 1, 'E')
;

select d as `DATE`, count(*) as UNIQUES
from (
    select name, min(d) as d
    from t
    where id = 1
    group by name
    ) s
group by `DATE`
order by `DATE` desc
;
+------------+---------+
| DATE       | UNIQUES |
+------------+---------+
| 2012-09-18 |       1 |
| 2012-09-17 |       1 |
| 2012-09-16 |       2 |
+------------+---------+