我认为从我拥有的表格和我的目标结果开始是最容易的。
Name | Date
A | 03/01/2012
A | 03/01/2012
B | 02/01/2012
A | 02/01/2012
B | 02/01/2012
A | 02/01/2012
B | 01/01/2012
B | 01/01/2012
A | 01/01/2012
我希望查询结果为:
Name | 01/01/2012 | 02/01/2012 | 03/01/2012
A | 1 | 2 | 2
B | 2 | 2 | 0
所以基本上我想计算具有相同日期的行数,但是对于每个单独的名称。所以一个简单的日期组不会这样做,因为它会将名称合并在一起。然后我想输出一个表格,用PHP显示每个日期的计数。
我见过这样的答案:
SELECT
NAME,
SUM(CASE WHEN GRADE = 1 THEN 1 ELSE 0 END) AS GRADE1,
SUM(CASE WHEN GRADE = 2 THEN 1 ELSE 0 END) AS GRADE2,
SUM(CASE WHEN GRADE = 3 THEN 1 ELSE 0 END) AS GRADE3
FROM Rodzaj
GROUP BY NAME
所以我想我会有一种方法来调整,但我想知道是否有另一种方式,还是最有效的? 我或许在想,如果while循环每次只输出一个特定的名称和日期以及计数,那么第一个结果将是A,01/01 / 2012,1然后是下一个A,02/01/2012, 2 - A,03/01 / 2012,3-B,01/01 / 2012,2等可能通过不同的技术可行,但不确定这样的事情是否可行以及是否有效。< / p>
所以我基本上是在想看看是否有人有任何想法,以及他们将如何进行比较。
我希望我能很好地解释一切,并提前感谢您的帮助。
答案 0 :(得分:2)
您必须在GROUP BY
中添加两列:
SELECT name, COUNT(*) AS count
FROM your_table
GROUP BY name, date
这将获得每个名字的计数 - &gt;行格式的日期组合。由于如果名称在特定日期没有任何行,您还希望包含0
计数,您可以使用:
SELECT a.name,
b.date,
COUNT(c.name) AS date_count
FROM (SELECT DISTINCT name FROM your_table) a
CROSS JOIN (SELECT DISTINCT date FROM your_table) b
LEFT JOIN your_table c ON a.name = c.name AND
b.date = c.date
GROUP BY a.name,
b.date
答案 1 :(得分:2)
你要的是“pivot”。基本上,它就是它。数据透视的真正问题是列名称必须适应数据,而单独使用SQL是不可能的。
这是你如何做到的:
SELECT
Name,
SUM(`Date` = '01/01/2012') AS `01/01/2012`,
SUM(`Date` = '02/01/2012') AS `02/01/2012`,
SUM(`Date` = '03/01/2012') AS `03/01/2012`
FROM mytable
GROUP BY Name
请注意,在mysql SUM()
true
和1
为false
时,你可以0
在mysql中的条件很酷,所以总结了一个条件相当于计算它的真实次数。
首先使用内部组的效率并不高。
答案 2 :(得分:0)
以防任何人对什么是最好的方法感兴趣:
Zane的第二个建议是最慢的,我加载了我为其他两个做的三分之一数据并且花了很长时间。也许在较小的表上它会更有效率,虽然我没有使用一个巨大的表,但是大约28,000行足以产生显着的延迟,使用between子句将结果丢弃到大约4000行。
Bohemian的回答给了我最少的代码,我投入了一个循环来创建所有的case语句,并且相对容易。这种方法的好处是简单,除了为案例创建循环之外,结果不需要任何php技巧,只需简单的foreach即可获得所有列。推荐给那些对php不自信的人。
然而,我发现Zane的第一个建议是最快的表现,尽管需要额外的PHP编码,但似乎我会坚持使用这种方法。这种方法的缺点是它只提供实际拥有数据的日期,因此创建一个包含所有日期的表会变得有点复杂。我所做的是创建一个变量,跟踪它应该与每个表行上重置的表列进行比较的日期,当查询结果等于该日期时它回显该值,否则它会执行while循环回显表格单元格为0,直到日期匹配。它还必须检查“名称”值是否仍然相同,如果不是,它将在填充任何缺少的单元格后切换到下一行,其中0到该行的末尾。如果有人有兴趣看到你可以给我留言的代码。
两种方法的结果超过3个月的数据(每天一列,大约90个案例陈述)~28,000行中的12,000行:波希米亚人的枢轴 - ~0.158s(最高可见~0.36s)< Zane的Double Group由~~ 0.086s(最高可见~0.15s)