Mysql 查询以仅获取每个唯一列ID的3条记录
我有一个列出食物类型的表,我想运行一个查询,返回最多12种食物,但每个类别不超过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
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