-1

messageテーブルとテーブルがある SQL クエリに問題がありますrecipient

message

ID    author    date
--------------------
0        1      2013-07-08 05:38:47
1        1      2013-07-13 05:38:47
2        1      2013-07-15 05:38:47
3        1      2013-07-15 05:38:47
4        2      2013-07-17 05:38:47
5        1      2013-07-28 05:38:47

recipient

ID    m_id    recipient
--------------------
0        0      2
1        1      2
2        2      3
3        3      2
4        4      1
5        5      2

テーブルの最後の日付を含むテーブルから受信者列ごとにグループを含むテーブルからを返す必要があります。これを試してみますmessagerecipientmessage

SELECT m.* 
FROM message as m
INNER JOIN recipient as r ON (m.ID = r.m_id)
WHERE m.author = 1
GROUP BY r.recipient
ORDER BY m.ID DESC

リターンは

ID    author    date
--------------------
2        1      2013-07-15 05:38:47
0        1      2013-07-08 05:38:47

しかし、私は必要です

ID    author    date
--------------------
5        1      2013-07-28 05:38:47
2        1      2013-07-15 05:38:47

助けてください

MySQL サーバー 5.1 を使用しています


問題の解決策を見つけました

SELECT m.* 
FROM (
SELECT * FROM recipient 
    WHERE 1=1
    ORDER BY recipient.ID DESC
) AS r
INNER JOIN message AS m ON (r.m_id = m.ID)
WHERE m.author = 1
GROUP BY r.recipient

表を逆にするだけrecipient

4

2 に答える 2

2

標準SQLDISTINCT ONではないため、すべての RDBMS で利用できるわけではありません。

質問には言及されていませんが、コード例から派生して、実際には、特定のauthor受信者ごとに「最終日」の行を探しています。

SELECT DISTINCT ON (r.recipient)  m.*
FROM   message   m
JOIN   recipient r ON r.m_id = m.id
WHERE  m.author = 1
ORDER  BY r.recipient, m.date DESC, r.m_id -- to break ties

詳細と複数の SQL 標準の代替方法は次のとおり
です。各 GROUP BY グループの最初の行を選択しますか?

基本的な標準 SQL を使用した別のソリューション。MySQLを含むすべての主要な RDBMS で動作します(そのタグが追加されたため):

SELECT m.* 
FROM   message   m
JOIN   recipient r ON r.m_id = m.id
WHERE  m.author = 1
AND NOT EXISTS (
   SELECT 1
   FROM   message   m1
   JOIN   recipient r1 ON r1.m_id = m1.id
   WHERE  r1.recipient = r.recipient 
   AND    m1.author = 1
   AND    m1.date > m.date
   )

最新の日付の行のみがNOT EXISTS反準結合を通過します。

于 2013-08-10T18:24:24.030 に答える