2014-01-23 4 views
2

У меня есть две таблицы SQL:Выберите строки из таблицы соответствия других записей таблицы

элементы таблицы

item_id  name  timestamp 
-------------------------------------------- 
a   apple  2014-01-01 
b   banana  2014-01-06 
c   tomato  2013-12-25 
d   chicken 2014-01-23 
e   cheese  2014-01-02 
f   carrot  2014-01-16 

items_to_categories стол

cat_id  item_id 
-------------------------------------------- 
1   a 
5   c 
2   e 
3   a 
4   f 
5   d 
5   b 
5   a 

Знающие cat_id (, например, 5), мне нужно получить 2 lates т (на основе timestamp), принадлежащих этому cat_id.

Если бы я сначала получить 2 строки из items_to_categories таблицы:

SELECT item_id FROM items_to_categories WHERE cat_id = 5 LIMIT 2; 
>> returns 'c' and 'd' 

И затем использовать возвращенные детали идентификаторы для запроса элементы таблицы, я не убедившись возвращенные детали будут самые последние из них (порядка по timestamp).

Идеальный результат, что мне нужно, чтобы выбрать 2 последние детали cat_id (например 5) будет:

d   chicken 2014-01-23 
b   banana  2014-01-06 

ответ

2
SELECT t1.item_id, t1.name, t1.timestamp 
    FROM items t1 
    LEFT JOIN items_to_categories t2 ON t1.item_id = t2.item_id 
     WHERE cat_id = 5 
     ORDER BY t1.timestamp DESC 
     LIMIT 2; 

Использование выше запроса.

+0

Я бы присоединился к элементам items_to_categories, а не к тому, как это у вас есть, потому что это условие относится к items_to_categories, но +1 (несмотря на ненужный отступ) – Bohemian

1
SELECT top 2 I.item_id, I.name, I.timestamp 
FROM items I 
JOIN items_to_categories IC ON I.item_id = IC.item_id 
WHERE IC.cat_id in (Select top 1 from items_to_categories order by timestamp desc) 
ORDER BY I.timestamp DESC 
1

Вы можете попробовать что-то вроде этого

SELECT 
items.item_id 
items.item, 
items.item_timestamp 
FROM 
items_to_categories 
INNER JOIN items ON items_to_categories.item_id = items.item_id 
WHERE 
items_to_categories.cat_id = 5 
ORDER BY items.item_timestamp desc 
limit 2 

Кстати, отметка времени является зарезервированным словом, вы действительно должны избегать использования его для имени поля

Надеется, что это помогает

+0

+1 для указания, что «timestamp» является зарезервированным словом. –

0

Попробуйте это, используя соединение, чтобы получить требуемый результат.

SELECT a . * 
FROM items a 
INNER JOIN items_to_categories b ON a.item_id = b.cat_id 
ORDER BY a.timestamp DESC LIMIT 2 
Смежные вопросы