2

我正在使用派生表(最新版本的 MySQL)从其他表中获取计数和数据,并将其放入我的主要结果集中。LEFT OUTER JOIN 中的一个小查询给我带来了问题。我正在尝试使用 LIMIT 1 条件获取该博客成员发表最新评论的日期。下面的整个查询获取会员的帐户详细信息和活动/登录统计信息。

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname,
mem.email, mem.add1, mem.add2, mem.town, mem.county,
mem.post_code, mem.country_code, mem.country_name, mem.joined, mem.member_status,
IFNULL(rep.rep,0) as reputation,
IFNULL(com.cnt,0) as comments,
com1.lcomm as last_comment
FROM members AS mem
LEFT OUTER JOIN (
    SELECT member_id, SUM(awarded_what) as rep
    FROM members_reputation
    GROUP BY member_id) rep
    ON mem.member_id = rep.member_id
LEFT OUTER JOIN (
    SELECT member_id, COUNT(comment_id) as cnt
    FROM blog_comments
    GROUP BY member_id) com
    ON mem.member_id = com.member_id
LEFT OUTER JOIN (
    SELECT member_id, posted as lcomm
    FROM blog_comments
    ORDER BY posted DESC LIMIT 1) com1   **** problem with LIMIT
    ON mem.member_id = com1.member_id

// more left outer join sub queries to other tables

WHERE mem.member_id = 1
GROUP BY mem.member_id

我将查询标记为问题的地方就是问题所在。如果我使用ORDER BY posted DESC LIMIT 1,即使该成员有 4 条评论,它有时也不会返回 last_comment 日期,但有时会返回 - 不确定模式。如果我删除 LIMIT 1 它可以正常工作,但我担心它会返回所有评论日期,而不仅仅是最新日期,这会在数据库增长时导致我出现问题。

这里发生了什么?为什么 LIMIT 1 有时不返回 last_comment 日期?我的查询是否在没有 LIMIT 条件的情况下返回所有评论日期?解释/建议会很棒。

4

1 回答 1

4

这是你的问题

LEFT OUTER JOIN (
    SELECT member_id, posted as lcomm
    FROM blog_comments
    ORDER BY posted DESC LIMIT 1) com1   **** problem with LIMIT
    ON mem.member_id = com1.member_id

在您的另一个左连接节中,您正在按...进行分组,但在上述问题之一中,您依靠 join 子句将您的集合限制为 member_id,但是到那时您已经订购并受到限制...

这意味着有时(一个)结果与您的加入标准不匹配,导致空 lcomm

你需要这样的where子句

LEFT OUTER JOIN (
    SELECT member_id, posted as lcomm
    FROM blog_comments
        WHERE member_id = X
    ORDER BY posted DESC LIMIT 1) com1
    ON mem.member_id = com1.member_id
于 2012-04-04T22:22:48.300 回答