2012-03-25 62 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; 

,并且计划会安排在一个令发生导致排名正确访问行。