2013-02-14 2 views
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

Я не говорю, что это эффективно, но он должен работать:

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 
+1

: Я думаю, что ваш ответ правильный, но некоторые имена полей неверны. например: i ON c.categoryid должно быть c.id и нужно добавить i.categoryid здесь LEFT JOIN (SELECT i.id, i.itemname.Kindly verify – zamil

+0

@zamil Вы совершенно правы, спасибо. Редактировано – Dukeling

+0

спасибо, +1, потому что ваш ответ работает, но я проверяю эффективность этого решения. Если это наиболее эффективное решение, я согласен с этим. Я также жду другого предложения. – ahoo

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 (идентификатор, CHAR (8)) ORDER BY id DESC), ',', 2)

Поскольку GROUP_CONCAT по умолчанию сортирует ASC; выше будет SUBSTRING_INDEX (GROUP_CONCAT (CONVERT (id, CHAR (8))), ',', -2). Но результат GROUP_CONCAT усечен до максимального len 1024 (group_concat_max_len).

+1

[Обновлен SQLFiddle] (http://sqlfiddle.com/#! 2/9a132/5), чтобы показать правильные строки, а также включил мой запрос. Не слишком уверен, но я бы предположил, что ваш быстрее, чем мой (где + подзапрос VS временно). – Dukeling

+0

Я бы проверил на очень большом наборе данных; структура таблицы, индексы, другие оптимизации. –

Смежные вопросы