2

派生テーブル (MySQL の最新バージョン) を使用して、他のテーブルからカウントとデータをメインの結果セットに取得しています。LEFT OUTER JOIN の小さなクエリの 1 つが問題を引き起こしています。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 を削除すると問題なく動作しますが、最新の日付だけでなく、すべてのコメントの日付が返されるのではないかと心配しているため、DB が大きくなると問題が発生します。

ここで何が起こっているのですか?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

他の左結合スタンザでは、グループ化を行っています...しかし、上記の問題では、結合句に依存してセットをmember_idに制限していますが、それまでにすでに注文して制限しています...

これは、(1 つの) 結果が結合条件に一致せず、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 に答える