选择表A中的所有元素,按表B中与每个项链接的条目数排序

时间:2011-04-25 20:42:09

标签: php mysql

我有一个带有书签的表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.';

它有效,但我只得到一个在给定时间内被访问过零次的书签。任何其他未访问过的书签都不会显示。

为什么会这样?

我如何获得所有书签,即使他们在特定时期内没有被访问过?

2 个答案:

答案 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_linkhit_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