リストのテーブルとリスト項目のテーブルがあります。リスト テーブル内の各アイテムに対して 1 つのリスト アイテムのみを選択するクエリを作成したいと考えています。私の質問を説明するための簡単なデータを次に示します。
'lists' table
id updated share
--- ---------- -----
1 2013-07-11 1
2 2013-07-13 0
3 2013-07-15 1
4 2013-07-14 0
5 2013-07-14 1
'list_items' table
id l_id description sort likes
-- ---- ----------- ---- -----
1 1 hello 0 3
2 1 goodbye 0 0
3 1 thanks 0 4
4 2 ok 0 0
5 3 love 0 2
6 3 hate 1 1
7 4 celebrate 0 0
8 5 party 0 1
9 5 summer 1 5
10 5 winter 2 2
ここで、各共有リスト (共有 = 1) から最初のアイテムを取得したいとします。まず、リスト項目が「並べ替え」で並べ替えられているかどうかを意味します。
上記のデータに基づいて期待される結果は次のようになります。
lists.id id l_id description sort likes
-------- -- ---- ----------- ---- -----
1 1 1 hello 0 3
3 5 3 love 0 2
5 8 5 party 0 1
更新: peterm と hims056 によって提供されたソリューションに頭を悩ませましたが、kayla のソリューションは私が従うことができるもののように見えましたが、正しい結果が返されませんでした。これらのソリューションからアイデアを得る
SELECT * FROM (
SELECT lists.id AS listid, lists.share, list_items.*
FROM list_items, lists
WHERE lists.id = l_id
AND lists.share = 1
ORDER BY sort) q
GROUP BY q.listid
これは機能しているように見えますが、peterm が指摘しているように、group by 句の一部ではない select 句の列の値があいまいになる可能性があります。
LIMIT
それが私が最初にやろうと思っていた方法だったので、誰かが解決策を思いつくだろうと思いました。次の方法で、共有を許可するリスト ID を返すことができます。
SELECT lists.id FROM lists WHERE share = 1
特定のリスト ID に対して、次の方法でトップ リスト アイテムを返すことができます。
SELECT lists.id AS listid, lists.share, list_items.*
FROM list_items, lists
WHERE lists.id = l_id
AND lists.id = 1
ORDER BY sort
LIMIT 1
しかし、これら 2 つのステートメントをまとめて、共有を許可する各リストのトップ リスト アイテムを返す方法はありますか?