3

このSQLクエリは完全に機能していました。データベースにいくつかの小さな変更を加えて再実行すると、動作が停止しました。

ここでの私の目標は、と結合することですがmaster_followups、最も最近結合されたfollowups_fb_messages.message_textUIDごとに1つの行のみを返します。master_followupsfollowups_fb_messages.message_text

SELECT master_followups.*, 
  followups_fb_messages.message_text, 
  followups_fb_messages.message_time 
FROM
  master_followups 
  LEFT JOIN followups_fb_messages 
    ON master_followups.UID = followups_fb_messages.FID 
    AND followups_fb_messages.message_time = 
      (SELECT
        MAX(followups_fb_messages.message_time) 
        FROM followups_fb_messages 
        WHERE  followups_fb_messages.FID = master_followups.UID
      )

私はこの1時間何が起こったのかを理解しようとしてきました。

期待どおりに100の結果を返す代わりに、これは340を返します。データベースを確認したところ、100行master_followupsと340行が表示されていfollowups_fb_messagesます。

この正確なクエリは約1時間前に正常に機能していましたが、その後停止しました。何かを変えたのかもしれませんが、見えません。

4

4 に答える 4

2

これを試してみてください。

SELECT  a.*, 
        b.*
FROM    master_followups a
        LEFT JOIN followups_fb_messages b
            ON a.UID = b.FID
        LEFT JOIN 
        (
            SELECT  FID, MAX(message_time) maxTime
            FROM    followups_fb_messages
            GROUP BY FID
        ) c ON b.FID = c.FID AND
                b.message_TIME = c.maxTime
于 2012-10-08T01:13:19.650 に答える
2

おそらく、重複が発生する理由は、複数の行に最大メッセージ時間が含まれているためです。これを修正する1つの方法は次のとおりです。

 SELECT master_followups.*, 
        ffm.message_text, 
        ffm.message_time 
FROM master_followups LEFT JOIN
     (select *, row_number() over (partition by fid order by message_time desc) seqnum
      from followups_fb_messages
     ) ffm 
     ON master_followups.UID = ffm.FID and
        seqnum = 1

これはmessage_timeに基づいて最大行を検索しますが、重複がある場合にのみ1つの行を選択します。

于 2012-10-08T01:18:05.143 に答える
1

いくつかのTDQD—テスト駆動クエリ設計を使用してみましょう。

各IDの最新のフォローアップメッセージの時刻

SELECT FID, MAX(message_time) AS MostRecent
  FROM followups_fb_messages
 GROUP BY FID

各IDの最新のフォローアップメッセージ情報

SELECT a.*
  FROM followups_fb_messages AS a
  JOIN (SELECT FID, MAX(message_time) AS MostRecent
          FROM followups_fb_messages
         GROUP BY FID
       ) AS b ON a.FID = b.FID AND a.message_time = b.MostRecent

これは通常の内部結合であり、外部結合ではないことに注意してください。

マスターフォローアップ情報とフォローアップメッセージ情報

SELECT m.*, f.message_text
  FROM master_followups AS m
  LEFT JOIN
       (SELECT a.FID, a.message_text
          FROM followups_fb_messages AS a
          JOIN (SELECT FID, MAX(message_time) AS MostRecent
                  FROM followups_fb_messages
                 GROUP BY FID
               ) AS b ON a.FID = b.FID AND a.message_time = b.MostRecent
       ) AS f ON f.FID = m.UID
于 2012-10-08T01:24:43.367 に答える
1

少し修正されたジョンの答えはどうですか?

SELECT  a.*, 
        b.*
FROM    master_followups a
    LEFT JOIN followups_fb_messages b
        ON (b.FID = c.FID AND b.message_time = c.maxTime)
    LEFT JOIN 
    (
        SELECT  FID, MAX(message_time) maxTime
        FROM    followups_fb_messages
        GROUP BY FID
    ) c ON a.UID = c.FID
于 2012-10-08T01:26:25.677 に答える