Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-不使用UNION从同一个表中选择两行_Mysql - Fatal编程技术网

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;