mysql查询:SELECT DISTINCT column1,GROUP BY column2

时间:2010-03-20 15:02:42

标签: mysql select group-by distinct

现在我有以下查询:

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)。

5 个答案:

答案 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