0

リストのテーブルとリスト項目のテーブルがあります。リスト テーブル内の各アイテムに対して 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 つのステートメントをまとめて、共有を許可する各リストのトップ リスト アイテムを返す方法はありますか?

4

3 に答える 3

1
SELECT lists.id, list_items.id, l_id, description, sort, likes 
  FROM (SELECT * FROM lists WHERE share = 1) lists 
  LEFT JOIN (SELECT * FROM list_items GROUP BY l_id) list_items 
  ON  lists.id = l_id
于 2013-07-15T04:19:14.303 に答える
0

list_items.id並べ替えを最小にしたいので、次list_items.sortのように二重にネストされたクエリを実行する必要があります。

SELECT tbl.l_id list_id, tbl.minID, li.description, li.sort, li.likes 
FROM list_items li
JOIN
(
    SELECT l.l_id,MIN(l.id) minID FROM list_items l
    JOIN
    (
        SELECT li.l_id,MIN(li.sort) sort FROM list_items li
          JOIN lists l ON li.l_id = l.id WHERE l.share = 1
         GROUP BY li.l_id
    ) l2
    ON l.l_id = l2.l_id
    AND l.sort = l2.sort
    GROUP BY l.l_id
) tbl
ON  li.id = tbl.minID;
于 2013-07-15T04:41:08.047 に答える