0

たとえば、ORごとにLIMIT 1にする方法がMySQLにあるかどうか疑問に思っていました。たとえば、MySQL ステートメントSELECT * FROM posts WHERE username = 'Johnny' OR username = 'Matthew' OR username = 'Andy' OR username = 'Sandra' ORDER BY date DESCがあるが、各ユーザー名 (または、この場合は各ユーザーの最新の投稿) から 1 つの結果のみを返したい場合です。私は試しましSELECT * FROM posts WHERE (username = 'Johnny' LIMIT 1) OR (username = 'Matthew' LIMIT 1) OR (username = 'Andy' LIMIT 1) OR (username = 'Sandra' LIMIT 1) ORDER BY date DESCたが、それが私が考えることができるすべてです(そしてうまくいきませんでした)。前もって感謝します、マシュー

4

2 に答える 2

2

UNION個別のクエリを組み合わせるために使用できます。

(SELECT * FROM posts WHERE username = 'Johnny'  LIMIT 1)
UNION ALL
(SELECT * FROM posts WHERE username = 'Matthew' LIMIT 1)
UNION ALL
(SELECT * FROM posts WHERE username = 'Andy'    LIMIT 1)
UNION ALL
(SELECT * FROM posts WHERE username = 'Sandra'  LIMIT 1)

または、結果をユーザー名でグループ化できます。

SELECT   *
FROM     posts
WHERE    username IN ('Johnny','Matthew','Andy','Sandra')
GROUP BY username

上記の両方のクエリは、ユーザーごとに不確定な行を返します (必要な場合とそうでない場合があります)。特定の行をフェッチするには、MySQL が必要な行を決定する方法を指定してください。


アップデート

各ユーザーの最新の投稿を取得し、結果セットを最新のものから古いものの順に並べ替えるには:

(SELECT * FROM posts WHERE username = 'Johnny'  ORDER BY date DESC LIMIT 1)
UNION ALL
(SELECT * FROM posts WHERE username = 'Matthew' ORDER BY date DESC LIMIT 1)
UNION ALL
(SELECT * FROM posts WHERE username = 'Andy'    ORDER BY date DESC LIMIT 1)
UNION ALL
(SELECT * FROM posts WHERE username = 'Sandra'  ORDER BY date DESC LIMIT 1)
ORDER BY date DESC

と:

SELECT   *
FROM     posts NATURAL JOIN (
           SELECT   username, MAX(date) AS date
           FROM     posts
           WHERE    username IN ('Johnny','Matthew','Andy','Sandra')
           GROUP BY username
         ) AS t
GROUP BY username -- only required if multiple posts might have the same date
ORDER BY date DESC
于 2012-06-28T01:11:27.697 に答える
0

ユニオンを使用するのはどうですか?

@eggyal 修正のおかげで編集されました:

(SELECT * FROM posts WHERE username = 'Johnny' LIMIT 1)
UNION
(SELECT * FROM posts WHERE username = 'Matthew' LIMIT 1)
UNION
(SELECT * FROM posts WHERE username = 'Andy' LIMIT 1)
于 2012-06-28T01:11:18.777 に答える