たとえば、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
たが、それが私が考えることができるすべてです(そしてうまくいきませんでした)。前もって感謝します、マシュー
質問する
99 次
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 に答える