【问题标题】:mysql query: SELECT DISTINCT column1, GROUP BY column2mysql查询: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

标签: mysql select group-by distinct


【解决方案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 函数是否允许聚合函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2021-02-09
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多