Mysql 查询以仅获取每个唯一列ID的3条记录

Mysql 查询以仅获取每个唯一列ID的3条记录,mysql,Mysql,我有一个列出食物类型的表,我想运行一个查询,返回最多12种食物,但每个类别不超过3种。我可以在一个查询中完成此操作吗 category food tastyFactor id seafood fish 100 1 seafood prawns 150 2 seafood crab 50 3 seafood oysters 300 4 meat chicken

我有一个列出食物类型的表,我想运行一个查询,返回最多12种食物,但每个类别不超过3种。我可以在一个查询中完成此操作吗

category    food    tastyFactor id
seafood     fish    100         1
seafood     prawns  150         2
seafood     crab    50          3
seafood     oysters 300         4
meat        chicken 20          5
meat        pork    100         6
meat        lamb    40          7
meat        beef    50          8
vegetables  carrot  10          9
vegetables  cabbage 300         10
vegetables  potato  75          11
vegetables  parsnip 500         12
食物应按tastyFactor排序,在结果集中出现的较早时间,以最小的数字排序

在我的示例中,结果应该是:

carrot
chicken
lamb
beef
crab
potato
fish
prawns
cabbage
可以使用UNION组合具有相同内容的多个查询:

SELECT food FROM (
  (SELECT category, food, tastyfactor, id FROM table  
    WHERE category = 'seafood' LIMIT 3)
  UNION
  (SELECT category, food, tastyfactor, id FROM table 
    WHERE category = 'meat' LIMIT 3)
  UNION
  (SELECT category, food, tastyfactor, id FROM table 
    WHERE category = 'vegetables' LIMIT 3)
) AS food_from_cateogry ORDER BY tastyfactor

假设您事先不知道类别的数量,您仍然可以进行查询。您需要从枚举每个类别中的值开始。虽然您可以使用变量,但我将选择关联子查询方法进行枚举:

select ft.food
from (select ft.*,
             (select count(*)
              from FoodTypes ft2
              where ft2.category = ft.category and
                    (ft2.tastyFactor < ft.tastyFactor or
                     ft2.tastyFactor = ft.tastyFactor and ft2.id <= ft.id
                    )
             ) as cat_seqnum
      from FoodTypes ft
     ) ft
where cat_seqnum <= 3
order by TastyFactor
limit 12;

请注意,您可能需要更多地思考如何处理领带。

可以使用GROUP_CONCAT和FIND_IN_SET的组合来完成。对于较大的数据集,我认为处理会降低,但对于较小的数据,处理会相当简单

SELECT a.food
      ,b.category
      ,find_in_set(a.food, foods) ranking
  FROM food a
       INNER JOIN (
          SELECT category,
                 GROUP_CONCAT(food ORDER BY tastyFactor DESC) foods
            FROM food
           GROUP BY category
       ) b ON a.category = b.category
 WHERE FIND_IN_SET(a.food, foods) <= 3
 ORDER BY category
         ,ranking ASC

你试过什么?您尝试的问题是什么?作为补充:在每个单独查询的末尾添加“限制3”。您能想象这个解决方案有多不切实际吗?您有更好的解决方案吗?发布它,收集你的甜蜜代表!我得到的每个派生表都必须有自己的别名-看起来我需要在order byA better解决方案之前输入表名?但这不是一个解决方案-
SELECT a.food
      ,b.category
      ,find_in_set(a.food, foods) ranking
  FROM food a
       INNER JOIN (
          SELECT category,
                 GROUP_CONCAT(food ORDER BY tastyFactor DESC) foods
            FROM food
           GROUP BY category
       ) b ON a.category = b.category
 WHERE FIND_IN_SET(a.food, foods) <= 3
 ORDER BY category
         ,ranking ASC