Mysql SQL-不使用UNION从同一个表中选择两行
我有桌子:Mysql SQL-不使用UNION从同一个表中选择两行,mysql,Mysql,我有桌子: meal_categories --------------------------- category_id | category_name 1 | Hot Drinks 2 | Cold Drinks 3 | Alcohol Drinks meals --------------------------------- meal_id | category_id | meal_name 1 | 1
meal_categories
---------------------------
category_id | category_name
1 | Hot Drinks
2 | Cold Drinks
3 | Alcohol Drinks
meals
---------------------------------
meal_id | category_id | meal_name
1 | 1 | Tea
2 | 2 | Sprite
3 | 3 | Vodka + Sprite
meals_to_meals
------------------------
meal_id | mapped_meal_id
3 | 2
正如你所看到的,任何一顿饭里面都可以有任意数量的其他食物(来自相同/其他类别)
假设我需要显示第三顿饭(伏特加+雪碧)的类别和任何子类别(以及其中使用过的饭菜的数量),如果这顿饭有。因此,结果应该是:
category_name | total_meals
Alcohol Drinks | 1
Cold Drinks | 1
如果有人对这些数字的含义感到困惑:3rd一餐属于酒精饮料类,所以我们有1餐,3rd一餐也有冷饮类的一餐,所以我希望计算有意义
对我来说,最大的挑战是将每餐的子餐选择为单独的一行。如果我使用JOIN查询,它将只返回一行(即使它正确返回映射的用餐id):
因此,经过大量搜索,我决定使用UNION:
SELECT aaa.* FROM meals as aaa
JOIN meals_to_meals
ON aaa.meal_id=meals_to_meals.meal_id
GROUP BY aaa.meal_id
UNION ALL
SELECT meals.* FROM meals_to_meals
JOIN meals
ON meals_to_meals.mapped_meal_id=meals.meal_id
这个函数正确地返回膳食+映射膳食(作为单独的行),但是如果我添加更多的查询来显示类别和其中的膳食数量,我会得到错误使用的SELECT语句有不同的列数
我确信,如果我能够在不使用UNION的情况下获得相同的结果,我可以以某种方式显示类别(这样查询对我来说更容易理解)。有什么想法吗
顺便说一句,这是提琴,请随意使用它-
UNION ALL
已经是最好的方法,只要这只是两个级别(一杯饮料可以包含其他饮料,但一杯饮料不能包含其他饮料本身包含其他饮料的其他饮料-您需要一个MySQL没有功能的递归查询)
以下是第3餐的查询:
select mc.category_name, count(*) as total_meals
from
(
select category_id from meals where meal_id = 3
union all
select category_id from meals where meal_id in
(select mapped_meal_id from meals_to_meals where meal_id = 3)
) c
join meal_categories mc using (category_id)
group by mc.category_name
order by mc.category_name;
SQL fiddle:数量不等于质量,我不明白您是如何达到预期输出的。UNION很容易理解,它将两个选择的结果连接在一起。是的,您理解得很对,膳食只能“一级深”。您的查询看起来很容易理解,非常感谢!
select mc.category_name, count(*) as total_meals
from
(
select category_id from meals where meal_id = 3
union all
select category_id from meals where meal_id in
(select mapped_meal_id from meals_to_meals where meal_id = 3)
) c
join meal_categories mc using (category_id)
group by mc.category_name
order by mc.category_name;