7

重複の可能性:
mysql:GROUP BY内でLIMITを使用して、グループごとにN個の結果を取得しますか?

私は2つのテーブルを持っています:

  1. アイテム
  2. カテゴリ

各アイテムはカテゴリに属しています。私がやりたいのは、カテゴリーごとに5つのアイテムを選択することですが、合計で20のアイテムを言います。

SELECT 

   item_id, item_name, items.catid 

FROM

   items, categories

WHERE

   items.catid = categories.catid

GROUP BY items.catid LIMIT 0,5 //5 per category group

編集:カテゴリごとに5つを超えるアイテムがある場合、それらはitem_id(数値)で並べ替える必要があります

4

2 に答える 2

5

このクエリを試してください-

SELECT item_id, item_name, catid FROM 
  (SELECT t1.*, COUNT(*) cnt FROM items t1
    LEFT JOIN items t2
      ON t2.catid = t1.catid AND t2.item_id <= t1.item_id 
  GROUP BY
    t1.catid, t1.item_id
  ) t
WHERE
  cnt < 6
-- LIMIT 20

カテゴリごとに最初の5つのアイテムが表示されます。必要に応じてコメントを外しLIMIT 20ます。Categories必要に応じてテーブルに参加します。

于 2012-11-13T11:24:12.197 に答える
0
SELECT item_id, item_name, catid
FROM (  SELECT item_id, item_name, catid,
            CASE WHEN @catid != catid THEN (@rownum := 1) + !(@catid := catid) ELSE @rownum := $rownum + 1 AS rownum
        FROM (  SELECT item_id, item_name, i.catid
                FROM items AS i
                INNER JOIN categories AS c
                ON i.catid = c.catid
                ORDER BY i.catid ASC) AS h, (SELECT @catid := NULL, @rownum := NULL) AS var
                HAVING rownum <= 5
                LIMIT 20) AS h2
ORDER BY item_id

Devartのソリューションは正しいように見えますが、私はそれを完全に理解している少しのピクルスを持っています。私の物は他の人にそれほど意味をなさないかもしれませんが、私にはそうです。

編集:今Devartのソリューションを理解してください、そしてそれは実際には非常に素晴らしいです。:)

于 2012-11-13T12:07:33.087 に答える