2013-05-01 44 views
2

我现在有点卡住了,可以使用一些快速的MySQL帮助。对于每个不同的MySQL,获得一定数量的条目

说我有一张表,包含产品评论,列product_id,customer, date。 现在对于每一个不同的产品,我想得到3个第一评论。 ORDER BY日期很简单,但我坚持如何为每个不同的product_id准确地获取3个条目。由于它全部在同一个表中,因此INNER JOIN实际上没有任何意义,GROUP BY也不是。 那么,有什么想法?

编辑:我已经成功地使用在SQLFiddle此查询:

SELECT * FROM (
    SELECT customer, DATE, p_asin, @curTop := 
    CASE WHEN (
    @prevP_asin <> p_asin 
    ) 
    THEN 1 
    ELSE @curTop +1 
    END AS Top, @prevP_asin := p_asin 
    FROM reviews2 r, (
    SELECT @curTop :=0 
) A 
ORDER BY r.p_asin, r.date) B 
WHERE top <=3 

但由于某些原因,当我尝试将其应用到我在phpMyAdmin表,与顶级的编号不被启动1用于新产品,而是统筹在一起。小提琴和实际表格的表现如何不同?

+1

http://stackoverflow.com/questions/3140589/mysql-query-select-top-3-rows-from-table-for-each-category可能会有帮助。 – 2013-05-01 14:58:53

回答

0

如果我们可以假定日期值是给定产品独特的下才起作用。如果不是这样,那么您需要在“p1.date < p.date”之后的where语句中添加一个唯一值,以便每行获得唯一的排名。

SQLFiddle here

SELECT * FROM (
    SELECT 
     product_id, 
     customer, (
     select count(*) as cnt from products p1 
      where p1.product_id = p.product_id and 
       p1.date < p.date 
     ) rnk 
    FROM 
     products P 
    ORDER BY 
     P.product_id, P.date 
    ) A 
    WHERE rnk < 3 
+0

这似乎工作;非常感谢你的努力! – void 2013-05-02 15:02:10

0

在Oracle中,您可以使用rank(),但在MySQL中不可用。我用这个网页,如何做到这一点的想法:rank over in mysql

而且,在这里它是在SQLFiddle

SELECT * FROM (
SELECT 
    product_id, 
    customer, 
    @curRank := case when (@prevProductID <> product_id) 
       then 1 else @curRank + 1 
      end as Rnk, 
    @prevProductID := product_id 
FROM 
    products p, (
    SELECT @curRank := 0 
    ) r 
ORDER BY 
    P.product_id, P.date 
) A 
    WHERE Rnk <= 3 
+0

谢谢,这对SQLFiddle来说非常有用 - 我将模式的一部分复制到那里并调整了语句;但由于某种原因(即使它应该是相同的),当我尝试在我的数据库上执行它时(使用PhpMyAdmin),它不会从每个不同的客户(或我的表中的产品)开始再次从1开始计数,但只是计数通过所有的条目,只剩下最后一个WHERE的3行。 MySQL如何表现如此不同? – void 2013-05-02 13:18:56

+0

啊,我误解了这个问题,并且让它得到了每个客户的前三行。让我重写它为Product_ID。另外 - 我更新了SQLFiddle。你可以发布你的查询 - 如果它不同于我的,也许我们可以看到它为什么不起作用? – tylert 2013-05-02 14:00:12

+0

//在此处难以辨认,我在问题 – void 2013-05-02 14:05:50