Mysql加入限制?

时间:2009-06-25 06:54:28

标签: mysql

我有一张包含类别,产品和数量的表格。所有整数。 我正在寻找最有效的查询,它将为我提供每个类别的前十大产品(最高计数)。

我已经尝试了几个子选择和连接,但无法弄清楚如何在单个查询中执行此操作。谢谢你的帮助。

5 个答案:

答案 0 :(得分:7)

select a.* from t a where 10 >  (
   select count(*) from t b 
   where b.category=a.category 
   and b.count<a.count
) 

我认为这就是你所需要的。

答案 1 :(得分:4)

在我的博客中对本文稍作修改的查询:

SELECT  l.*
FROM    (
        SELECT  category,
                COALESCE(
                (
                SELECT  count
                FROM    mytable li
                WHERE   li.category = dlo.category
                ORDER BY
                        li.category DESC, li.count DESC, li.id DESC
                LIMIT 9, 1
                ), CAST(-1 AS DECIMAL)) AS mcount
                COALESCE(
                (
                SELECT  id
                FROM    mytable li
                WHERE   li.category = dlo.category
                ORDER BY
                        li.category DESC, li.count DESC, li.id DESC
                LIMIT 9, 1
                ), CAST(-1 AS DECIMAL)) AS mid
        FROM    (
                SELECT  DISTINCT category 
                FROM    mytable dl
                ) dlo
        ) lo, mytable  l
WHERE   l.category >= lo.category 
        AND l.category <= lo.category
        AND (l.count, l.id) >= (lo.mcout, lo.id)

您需要在(category, count, id)上创建一个复合索引,以便高效工作。

请注意使用l.category >= lo.category AND l.category <= lo.category而不仅仅是l.category = lo.category

这是让MySQL使用高效Range check for each record

的黑客攻击

答案 2 :(得分:2)

我认为

This article解决了您的问题。

基本上,它说如果你的桌子很小,你可以做一个自我不平等的加入,如下:

SELECT t1.*, COUNT(*) AS countRank
FROM tbl AS t1
JOIN tbl AS t2 ON t1.category=t2.category AND t1.count <= t2.count
GROUP BY t1.category, t1.count
HAVING countRank <= 10
ORDER BY category,count DESC;

这是一项昂贵的操作,但对于小桌子你应该没问题。如果你有一个大表,你应该忘记用一个查询来实现它并实现一个不同的解决方案。

答案 3 :(得分:1)

SET @row = 0;
SET @category = 0;
 
SELECT top.*
FROM (
  SELECT IF(@category = p.cId, @row := @row + 1, @row := 1) rowNumber,
    (@category := p.cId) categoryId,
    p.pId
  FROM (
    SELECT c.cId,
      c.pId
    FROM prod pr
      INNER JOIN cat_prod c ON c.pId = pr.id
    GROUP BY c.cId, c.pId
    ) p
  ) top
HAVING top.rowNumber < 4;

答案 4 :(得分:0)

select a.* from `table` a where a.product in (
    select b.product from `table` b 
    where b.category=a.category 
    order by b.count desc 
    limit 10
)

我认为这是一个好方法,但mysql会返回:

 MySQL 返回:文档
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'