现在我有以下查询:
SELECT name, COUNT(name), time, price, ip, SUM(price)
FROM tablename
WHERE time >= $yesterday
AND time <$today GROUP BY name
我想做的是通过列'ip'添加DISTINCT,即
SELECT DISTINCT ip FROM tablename
所以我的最终输出将是所有列,从今天时间的所有行,按名称分组(每个重复名称的名称计数),没有重复的IP地址。
我的查询应该是什么样的? (或者,如何使用php将丢失的过滤器添加到输出中?)
提前致谢。
[更新]
为了最大限度地减少混淆,请考虑这个(简化的)db表:
| name | ip |
---------------------
| mark | 123 |
| mark | 123 |
| mark | 456 |
| dave | 789 |
| dave | 087 |
我正在寻找的结果将是一个HTML表格,如下所示:
| name | name count |
----------------------------
| mark | 2 |
| dave | 2 |
我目前得到的是:
| name | name count |
----------------------------
| mark | 3 |
| dave | 2 |
(它标记3次,即使两次使用相同的ip)。
答案 0 :(得分:51)
您可以使用COUNT(DISTINCT ip)
,这只会计算不同的值
答案 1 :(得分:13)
用FROM tablename
替换FROM (SELECT DISTINCT * FROM tablename)
可以为您提供所需的结果(忽略重复的行),例如:
SELECT name, COUNT(*)
FROM (SELECT DISTINCT * FROM Table1) AS T1
GROUP BY name
测试数据的结果:
dave 2
mark 2
答案 2 :(得分:3)
您可以添加DISTINCT(ip)
,但必须在查询开始时添加。请务必转义进入SQL字符串的PHP变量。
SELECT DISTINCT(ip), name, COUNT(name) nameCnt,
time, price, SUM(price) priceSum
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY ip, name
答案 3 :(得分:2)
不知何故,你的要求听起来有些矛盾......
按名称分组(基本上是名称上的不同加上准备聚合)然后是IP上的不同
如果两个人(姓名)在指定的时间段内使用同一个IP工作,您认为应该怎么办?
你试过这个吗?
SELECT name, COUNT(name), time, price, ip, SUM(price)
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY name,ip
答案 4 :(得分:2)
尝试以下方法:
SELECT DISTINCT(ip), name, COUNT(name) nameCnt,
time, price, SUM(price) priceSum
FROM tablename
WHERE time >= $yesterday AND time <$today
GROUP BY ip, name