这是我的问题:
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 + ...
答案 0 :(得分: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'))
将空值转换为非空值,因此它们将被包含在内。
“未定义的值”可以是第一行,最后一行,第一行,其中某些内容为非null,第一行在索引中,第一行在某些缓存中,等等。没有定义在编写无效查询时应该发生什么。
我知道的除MySQL以外的每个SQL数据库都会给你一个错误信息,甚至不会运行查询。要使查询有效,它必须包含组中的所有非聚合列。例如。 mac和userag_hash必须都是分组。