2012-03-25 47 views
1

我有兩個表格......第一個是帶有(page_id,page_title)行的頁面列表。第二個是這些頁面上的商品列表,每個商品都有一個價格(item_id,page_id,item_title,item_price)。MYSQL select 3「results id」的結果

我想從每個頁面抓取前三個項目(首先按最高item_price排序),頁面中累積價格最高的頁面排在第一位。這遠遠超出了我的MYSQL能力,我正在尋求如何使這個最有效率的建議! :) 謝謝!

+0

您想一次獲得所有頁面的前3項,還是一次獲得一頁? – 2012-03-25 02:52:49

+0

我想輸出所有頁面的列表,顯示每個頁面的前三項(頂部是最高價格,頁面按累計最高價格排序)。謝謝! – PotatoFro 2012-03-25 02:54:36

+0

給定一個項目,你怎麼知道它屬於哪個頁面? – 2012-03-25 05:04:08

回答

0

你可以通過幾種不同的方式來做到這一點。我會做的是運行一個查詢,說:「讓我的所有頁面按照它們的項目總數排序」,然後在php中循環遍歷它們,併爲每個頁面執行一個「讓我獲得當前頁面的前3項」 。

有意義嗎?

查詢一個(未經測試,我的手機上寫的):

SELECT p.page_name, (SELECT SUM(item_price) FROM items WHERE page_id = p.page_id) AS cumulative_price FROM pages p ORDER BY cumulative_price DESC; 

查詢兩(還未經測試)通過一個查詢結果的循環:

SELECT * FROM items WHERE page_id = '$currentPageId' ORDER BY item_price DESC LIMIT 3; 
+0

顯然你會在第一個查詢中包含頁面id以供第二個查詢使用。 – 2012-03-25 03:10:35

0
  • 我假設每PAGE_ID等於item_id,這就是它們如何鏈接在一起。 (如果沒有,請大家指正。)
  • 我只是要打電話給第二個表「表2」和ITEM_ID我找了「SOME_ITEM_ID」

    SELECT * FROM `table2` WHERE `item_id` = 'SOME_ITEM_ID' ORDER BY `item_price` DESC; 
    

在英語中是什麼這說的是:

從表2中選擇的一切,其中ITEM_ID是這個,以降序

由ITEM_PRICE對列表進行排序

此SQL語句將返回每一個命中,但您只需輸出代碼中的前三個。

+0

我這裏不好 - 我編輯了原帖。項目表通過「page_id」鏈接到頁表。項目同時具有「item_id」和「page_id」。 – PotatoFro 2012-03-26 17:52:25

0

我的直覺告訴我,有可能是沒有更快辦法做到這一點,而不是做一個for循環中的應用在所有的頁面,在做一個小select item_price from item where page_id = ? order by item_price desc limit 3每個paqe,並可能堅持的結果像memcached之類的東西,所以你不會對數據庫徵稅太多。

但我喜歡挑戰,所以我會嘗試它。

SELECT p1.*, i1.*, 
 (SELECT count(*) 
    FROM items i2 
    WHERE i1.item_price < i2.item_price 
    AND p1.page_id = i2.page_id) price_rank, 
FROM pages p1 
LEFT OUTER JOIN items i1 
ON p1.page_id = i1.page_id 
WHERE price_rank < 3; 

那奇子選擇是要大概做一個可怕的很多工作在items每一行。許多其他RDBMses有一個稱爲窗口函數的功能,可以更加優雅地進行上述操作。舉例來說,如果你使用PostgreSQL,你可以寫:

SELECT p1.*, i1.*, 
    RANK(i1.item_price) 
    OVER (PARTITION BY p1.page_id 
      ORDER BY i1.item_price DESC) price_rank 
FROM pages p1 
LEFT OUTER JOIN items i1 
ON p1.page_id = i1.page_id 
WHERE price_rank <= 3; 

,並且計劃會安排在一個令發生導致排名正確訪問行。