这是我的查询:
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
我在数据库中有一个表“video”,它包含数千个用户的数据,现在我想随机选择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+...
最佳答案
基于您只有一个聚合函数(count)并在 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 数据库都会给你一条错误消息,甚至不会运行查询。为了使查询有效,它必须具有分组依据中的所有非聚合列。例如。 mac 和 userag_hash 必须都在 group by 中。
关于mysql SELECT JOIN 和 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10123323/