我有一个带有书签的表lz_link
和一个表,用于存储名为lz_hits
的链接上的每次点击。然后,我想显示按照上周收到的点击次数排序的所有书签。
这是我目前的查询:
SELECT count(hit_time) as cnt, descr, l_id, url
FROM lz_link
LEFT JOIN lz_hits ON hit_lz=l_id
WHERE link_aktiv=1
&& hit_time >= '.(time()-Options::$most_hits_hit_days*3600*24).'
GROUP BY hit_lz
ORDER BY cnt DESC
LIMIT '.Options::$boxes_count.';
它有效,但我只得到一个在给定时间内被访问过零次的书签。任何其他未访问过的书签都不会显示。
为什么会这样?
我如何获得所有书签,即使他们在特定时期内没有被访问过?
答案 0 :(得分:1)
将适用于lz_hits的任何条件从WHERE子句移动到ON子句。 对不起,我无法发布查询 - 我在移动设备上。
编辑:也许这有用吗?SELECT count(hit_time) as cnt, descr, l_id, url
FROM lz_link
LEFT JOIN lz_hits ON hit_lz=l_id
AND hit_time >= '.(time()-Options::$most_hits_hit_days*3600*24).'
WHERE link_aktiv=1
GROUP BY hit_lz
ORDER BY cnt DESC
LIMIT '.Options::$boxes_count.';
假设link_active和hit_lz来自表lz_link。如果没有link_active,只需将其移动到ON子句,就像我使用hit_time一样。 至于hit_lz - 从左连接按列分组并没有多大意义。考虑使用其他列进行分组。
答案 1 :(得分:0)
所写的查询含糊不清。通常,在使用GROUP BY时,在SELECT列表中包含未包含在GROUP BY子句中的非聚合字段将是错误的。 MySQL显然允许这样做,但结果被认为是模棱两可的。不完全确定哪些字段在哪些表中,我无法完全确定,但此查询可能会给出所需的结果。我猜这里l_id
位于lz_link
而hit_lz
位于lz_hits
。
SELECT count(hit_lz) as cnt, descr, l_id, url
FROM lz_link
LEFT JOIN lz_hits ON hit_lz=l_id
AND hit_time >= '.(time()-Options::$most_hits_hit_days*3600*24).'
WHERE link_aktiv=1
GROUP BY l_id, descr, url
ORDER BY cnt DESC