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