我有一个创意查询请求,只有几个我自己的例子。
我有一个表,用以下字段记录用户的点击次数:
id
每次记录的匹配的唯一值referrer
网址的文字值date
unix时间戳的整数值unique
一个唯一标识用户的字符串(基本上是IP + salt的md5)(请注意,我意识到使用“unique
”作为字段名称最终会成为一个糟糕的设计选择,但将其放在反引号中有助于避免任何问题......)
我想查询一个返回unique
s列表及其第一个引荐来源的查询。
答案 0 :(得分:1)
如果您没有hit_id字段,则必须使用(unique
,date
)对作为行标识符。你应该能够得到你想要的东西。
SELECT `referrer` FROM `hits` h1 INNER JOIN
(SELECT `unique`, MIN(`date`) FROM `hits` GROUP BY `unique`) h2
ON h1.`unique` = h2.`unique` AND h1.`date` = h2.`date`
GROUP BY `referrer`
如果你有一个你没有提到的主键,比如hit_id,它会变得更短,并且可以避免出现同一个用户在同一秒内发生两次点击的罕见情况:
SELECT `referrer` FROM `hits` h1 INNER JOIN
(SELECT MIN(`hit_id`) FROM `hits` GROUP BY `unique`) h2
ON h1.`hit_id` = h2.`hit_id`
GROUP BY `referrer`
在这两种情况下,最后一个GROUP BY只是删除最终结果集中的重复项。
答案 1 :(得分:1)
如果您按日期查看每个用户的第一个推荐人,您可以执行以下操作:
CREATE TEMPORARY TABLE tmp_hits
SELECT
`unique`
, `date`
, `referrer`
FROM log_table
ORDER BY `date` ASC
;
SELECT
`unique`
, `referrer`
FROM tmp_hits
GROUP BY `unique`
;