mysql查询:SELECT DISTINCT column1,GROUP BY column2

Posted

技术标签:

【中文标题】mysql查询:SELECT DISTINCT column1,GROUP BY column2【英文标题】:mysql query: SELECT DISTINCT column1, GROUP BY column2 【发布时间】:2011-01-29 19:43:37 【问题描述】:

现在我有以下查询:

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 将缺少的过滤器添加到输出中)?

提前致谢。


[更新]

为了尽量减少混淆,请考虑这个(简化的)数据库表:

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

(即使两次使用相同的ip,它也会标记3次)。

【问题讨论】:

我也试过 SELECT DISTINCT ip FROM (SELECT name, COUNT(name), time, price, ip, SUM(price) FROM tablename WHERE time >= $yesterday AND time 尝试: SELECT DISTINCT TABLE.ip FROM (SELECT T.name, COUNT(T.name), T.time, T.price , T.ip, SUM(T.price) FROM tablename T WHERE time >= $yesterday AND time -"提供的参数不是有效的 mysql 结果资源" :( 好的,我正在拔头发,无法解决这个问题!!!:) 尝试新方法,新问题在这里:u.nu/4kau7 【参考方案1】:

你可以使用COUNT(DISTINCT ip),这只会计算不同的值

【讨论】:

哦,等一下。试图重现查询以回答 Marks 问题表明:这确实有效!!!!我不敢相信。我想我可能会哭。 如果您不提供整个 SELECT 语句,我们如何理解您的意思?【参考方案2】:

FROM tablename 替换为FROM (SELECT DISTINCT * FROM tablename) 应该会得到您想要的结果(忽略重复的行),例如:

SELECT name, COUNT(*)
FROM (SELECT DISTINCT * FROM Table1) AS T1
GROUP BY name

测试数据的结果:

dave 2
mark 2

【讨论】:

听起来不错。我如何提取数据? (以前从未在 SELECT 中使用过 SELECT)。表 1 是我的表吗?什么是T1?提前致谢 @Adam:是的,Table1 是您的表的名称,而T1 是该子查询的别名,因此您也可以写为SELECT T1.name, ...。 MySQL 需要所有子查询的别名(此答案为 +1)。 感谢彼得和马克。我如何使用我的 php 中的数据呢?我使用了 $data = mysql_query("SELECT...") 然后 while($row = mysql_fetch_array($data)) echo $row['name']; echo $row['COUNT(name)']; 但现在它返回空。 好的,更新:现在的问题是,如果我有一个 Dave 使用与 Mark 相同的 ip,然后另一个 Dave 不使用相同的 ip,则此查询不会显示我任何戴夫(当它仍然应该计算不共享相同IP的戴夫时)。尝试将 DISTINCT * 更改为 DISTINCT ip,但随后出现错误。【参考方案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

【讨论】:

尝试在开头添加 DISTINCT(ip) ,没有用,它只是忽略它。 'nameCnt' 是从哪里来的?我写错了查询吗? (除了 DISTINCT 之外,它之前与我一起工作,没有 'nameCnt' 和 'priceSum').... 最好给列加上别名,这样您就可以在 PHP 中通过别名来引用它们,而不必使用 $result['COUNT(name)'] - 而不是使用别名 $result['nameCnt' ]。我想你必须GROUP BY ip, name,回答更新 你不能真正做到这一点—— distinct 不是函数;它是适用于整行的关键字,或者是聚合函数的修饰符。在您的情况下,它是 SELECT 的关键字,这就是为什么它必须出现在列名之前的原因。 'ip' 周围的括号只是装饰性的。【参考方案4】:

不知何故,你的要求听起来有点矛盾..

按名称分组(基本上是名称上的不同加上准备聚合),然后是 IP 上的不同

如果两个人(名字)在指定的时间段内使用同一个 IP,你认为会发生什么?


你试过了吗?

SELECT name, COUNT(name), time, price, ip, SUM(price) 
  FROM tablename 
 WHERE time >= $yesterday AND time <$today 
GROUP BY name,ip

【讨论】:

我试过了,没有得到正确的结果。我想在 ip 上使用 DISTINCT 的原因是我不想要重复的 ip。我想在名称上使用 GROUP BY 的原因是我可以计算名称(例如,显示一个表格行,告诉我有多少名为“mark”的人)。我没有(也不会)在我的数据库中的同一个 IP 上有两个名称。 关于 GROUP BY name,ip ... 它没有解决问题,我认为它只按第一列分组而忽略第二列。 @Adam:它按名称和 IP 进行分组......您可以通过将 IP 移动到选择列表的第二个位置更轻松地看到这一点。 @Adam:如果您没有两个名称具有相同的 IP,那么您问题中的第一个 SELECT 语句为什么包含重复的 IP?每个 ID 应显示一个且只有一个名称。 @lexu 不确定那边到底发生了什么,但它不能消除重复项——不是针对名称,也不是针对 IP。【参考方案5】:

尝试以下方法:

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name

【讨论】:

DISTINCT 函数是否允许聚合函数?

以上是关于mysql查询:SELECT DISTINCT column1,GROUP BY column2的主要内容,如果未能解决你的问题,请参考以下文章

MySQL,在执行 SELECT DISTINCT 查询之前合并 2 个或更多表?

如何在 python 代码中添加 mysql 查询 select distinct?

mysql查询:SELECT DISTINCT column1,GROUP BY column2

php查询mysql时,报超出内存错误(select count(distinct))时

MySql 查询结果不包含重复

mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留