2013-01-07 63 views
4

我有3個表格:categories,itemsitems_categories。這是一個多對多的關係。這個表的結構是下一個:獲取MySQL中多對多關係的最後一個項目

CREATE TABLE `categories` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 
) 

CREATE TABLE `items_categories` (
    `item_id` int(10) unsigned NOT NULL, 
    `category_id` int(10) unsigned NOT NULL 
) 

CREATE TABLE `items` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `thumb` varchar(255) COLLATE utf8_unicode_ci NOT NULL 
) 

我有索引,但我刪除,因爲這個例子不需要。

我需要一個查詢,該查詢返回所有加入最後一項的類別,並且它不會重複。由於項目可以有很多類別,比如最終結果類別#1和#2中的項目#300(最新)具有類別#1和#2將與不同的項目結合。

現在我有這個疑問,但它不會做什麼,我到底要:

SELECT category_id, c.name, c.slug, item_id, i.name, i.thumb 
FROM items_categories AS ic 
INNER JOIN categories AS c ON c.id = ic.category_id 
INNER JOIN (SELECT * FROM items ORDER BY id DESC) AS i ON i.id = ic.item_id 
GROUP BY c.id 
ORDER BY c.id ASC 

它返回我重複的結果,它返回的第一個項目,而不是最後一次。

虛擬數據:http://pastebin.com/D75tr4Ry

我可怎麼辦呢?謝謝!

+0

看起來相當棘手的單個查詢。你不想在存儲過程或代碼中執行它? –

+0

@TJ可能重複的東西很棘手,不是嗎?至少可以完成與上一個項目的連接嗎?通過代碼將運行每個類別的查詢? – udexter

+0

是的,重複的部分。是的,加入最後可以完成。看到這個小提琴:http://sqlfiddle.com/#!2/45563/3(我希望我是正確的) –

回答

0

你只是忘了在子查詢中添加限制。使用限制後,您可以獲取最後一個項目的所有類別。

試試這個:

SELECT category_id, c.name, c.slug, item_id, i.name, i.thumb 
FROM items_categories AS ic 
INNER JOIN categories AS c ON ic.category_id = c.id 
INNER JOIN (SELECT * FROM items ORDER BY id DESC LIMIT 1) AS i ON ic.item_id = i.id 
GROUP BY c.id 
ORDER BY c.id ASC