0

这是我的查询:

SELECT v2.mac, v2.userag_hash, v2.area, count(*), count(distinct v2.video_id) 
FROM video v2 JOIN (
  SELECT distinct v.mac, v.userag_hash 
  from video v 
  WHERE v.date_pl >= '2012-01-30 00:00' AND 
    v.date_pl <= '2012-02-05 23:55' 
  ORDER BY rand() LIMIT 50
) table2 
ON v2.mac = table2.mac AND 
  v2.userag_hash = table2.userag_hash AND 
  v2.date_pl >= '2012-01-30 00:00' AND 
  v2.date_pl <= '2012-02-05 23:55' 
GROUP BY v2.mac, v2.userag_hash

我在数据库中有一个表“视频”,它包含几千个用户的数据,现在我想随机选择 50 个用户并根据选择的行计算,(每个用户由唯一的组合标识),这个查询的结果是:

 usermac1, userag_hash1, area1, 10, 5
 usermac2, userag_hash2, area2, 20, 8
  ...

但是如果我在查询末尾不使用“GROUP BY”,那么它只会返回一行:usermac, userag_hash, areax, 1500, 700(不知道这一行代表什么)

我想知道“1500, 700”是否是先前结果的最后两列的总和。比如 1500 = 10+20+... 700 = 5+8+...

4

1 回答 1

1

基于您只有一个聚合函数(计数)并用于 2 列的事实,并且您可以在没有 GROUP BY 的情况下运行它,您必须使用不符合标准的 MySQL。

SELECT v2.mac, v2.userag_hash, v2.area, count(*), count(distinct v2.video_id) 
...

无论您的数据是什么,当您使用聚合函数时,MySQL 都会返回一行,即:

<undefined value>, <undefined value>, count of all rows, count of rows where v2.video_id is distinct (and probably non null).

所以我认为你有 1500 行和 700 个不同的 v2.video_id 值,或 700 个非空的不同值。要测试这个空想法,请尝试:

count(distinct IFNULL(v2.video_id,'nullvaluehere'))

这会将空值转换为非空值,因此它们将被包含在内。

“未定义的值”可以是第一行、最后一行、非空值的第一个、索引中的第一个、某个缓存中的第一个等。当您编写无效查询时,没有定义应该发生什么。

我知道的除 MySQL 之外的每个 SQL 数据库都会给您一条错误消息,甚至不会运行查询。要使查询有效,它必须具有 group by 中的所有非聚合列。例如。mac 和 userag_hash 必须都在 group by 中。

于 2012-04-12T12:24:23.323 回答