2

結合したいテーブルが 2 つあるとします。カテゴリー:

id   name
----------
1    Cars
2    Games
3    Pencils
4    Books

そしてアイテム:

id   categoryid   itemname
---------------------------
1    1            Ford
2    1            BMW
3    1            VW
4    2            Tetris
5    2            Pong
6    3            Foobar Pencil Factory

カテゴリと最後の最大 N (例: 2) itemname を返すクエリが必要です。

category.id category.name item.id item.itemname
-------------------------------------------------
1           Cars          2       BMW
1           Cars          3       VW
2           Games         4       Tetris
2           Games         5       Pong
3           Pencils       6       Foobar Pencil Factory
4           Books         NULL    NULL

以下のようなクエリを書きたい:

Select * From categories c
 Left Join (select * from items order by id desc) i
 On c.id=i=categoryid
  AND LIMIT 2 #comment: N=2 this line not supported
 Where i.categoryid = c.id
 Group By c.id

ありがとう!

4

2 に答える 2

4

効率的だと言っているわけではありませんが、うまくいくはずです:

SELECT c.*, i.id, i.itemname
FROM categories c
LEFT JOIN
  (SELECT i.*
   FROM items i
   LEFT JOIN items i2 ON i.categoryid = i2.categoryid AND i2.id > i.id
   GROUP BY i.id
   HAVING COUNT(*) < 2         # this 2 = N
  ) i ON c.id = i.categoryid
于 2013-02-14T11:10:57.413 に答える
2

http://sqlfiddle.com/#!2/9a132/1 を確認してください

SELECT *
FROM Categories c 
LEFT JOIN -- Items i 
(
    SELECT * FROM Items WHERE LOCATE(id,
    (
        SELECT GROUP_CONCAT(it.itemids) AS its
        FROM (
                SELECT (SUBSTRING_INDEX(GROUP_CONCAT(CONVERT(id, CHAR(8))
                                                     ORDER BY id DESC), ',', 2)) AS itemids
                FROM Items
                GROUP BY categoryid
            ) it
    )) <> 0
) i
ON i.categoryid = c.id;

N=2 の場合: SUBSTRING_INDEX(GROUP_CONCAT(CONVERT(id, CHAR(8)) ORDER BY id DESC), ',', 2)

GROUP_CONCAT はデフォルトで sort ASC であるため。上記は SUBSTRING_INDEX(GROUP_CONCAT(CONVERT(id, CHAR(8)) ), ',', -2) になります。ただし、GROUP_CONCAT の結果は最大長 1024 (group_concat_max_len) に切り捨てられます。

于 2013-02-14T12:27:53.650 に答える