Mysql 使用JOIN和UNION组合来自不同表的记录

Mysql 使用JOIN和UNION组合来自不同表的记录,mysql,Mysql,我需要创建一个查询来组合来自两个表的数据,我认为可能是JOIN和UNION的组合 在本例中,我需要列出所有状态为活动状态的名称,只列出一次,并按名称排序,将它们的葡萄酒、苏打水、晚餐、甜点和水果偏好组合在一起 我不确定单独使用JOIN是否有效,因为两个表中并不总是有一个名称,而且UNION很棘手,因为它们没有相同的列。我曾尝试使用null值使联合工作,但这给了我每个名称重复的行,而不是将它们分组为每个名称一行 DRINK ====================================

我需要创建一个查询来组合来自两个表的数据,我认为可能是JOIN和UNION的组合

在本例中,我需要列出所有状态为活动状态的名称,只列出一次,并按名称排序,将它们的葡萄酒、苏打水、晚餐、甜点和水果偏好组合在一起

我不确定单独使用JOIN是否有效,因为两个表中并不总是有一个名称,而且UNION很棘手,因为它们没有相同的列。我曾尝试使用null值使联合工作,但这给了我每个名称重复的行,而不是将它们分组为每个名称一行

DRINK
====================================
name         status   wine    soda
----------   ------   ------  ------
John Smith   active   red     cola
Mary Jones   active   white   lemonade
Tom Brown    old      red     fanta
Judy White   active   red     dr pepper
Sam Wing     old      red     cola

FOOD
=============================================
name         status   dinner  dessert  fruit
----------   ------   ------  ------   ------
John Smith   active   steak   muffin   apple
Mary Jones   active   fish    cake     kiwi
Walter Yu    active   pasta   cake     banana
Jim Adams    old      steak   candy    apple
Adam Sheers  active   pasta   candy    grapes
我需要查询生成如下结果-

RESULT
==================================================================  
name         status    wine     soda       dinner  dessert  fruit
----------   ------    ------   ------     ------  ------   ------
Adam Sheers  active    -        -          pasta   candy    grapes
John Smith   active    red      cola       steak   muffin   apple
Judy White   active    red      dr pepper  -       -        -
Mary Jones   active    white    lemonade   fish    cake     kiwi
Walter Yu    active    -        -          pasta   cake     banana
非常感谢您在这方面的帮助

这应该有效:

SELECT names.name, drink.wine, drink.soda, food.dinner, food.dessert, food.fruit
FROM
    (SELECT name FROM food WHERE status = 'active'
    UNION
    SELECT name FROM drink WHERE status = 'active') names
LEFT JOIN drink ON drink.name = names.name
LEFT JOIN food ON food.name = names.name
结果

| NAME | WINE | SODA | DINNER | DESSERT | FRUIT | ---------------------------------------------------------------- | John Smith | red | cola | steak | muffin | apple | | Mary Jones | white | lemonade | fish | cake | kiwi | | Walter Yu | (null) | (null) | pasta | cake | banana | | Adam Sheers | (null) | (null) | pasta | candy | grapes | | Judy White | red | dr pepper | (null) | (null) | (null) | |名称|葡萄酒|苏打水|晚餐|甜点|水果| ---------------------------------------------------------------- |约翰·史密斯|红|可乐|牛排|松饼|苹果| |玛丽·琼斯|白|柠檬水|鱼|蛋糕|猕猴桃| |沃尔特·余|(空)|(空)|意大利面|蛋糕|香蕉| |亚当·谢尔斯|(空)|(空)|意大利面|糖果|葡萄| |朱迪·怀特|红|佩珀博士|(零)|(零)|(零)|(零)|
因此,您不希望Sam Wing出现在结果中?正确,两个表中只有状态为“活动”的名称。
status
不明确。什么表?这将返回两条记录。谢谢您的输入!看起来这将提供两个表之间的公共记录,但我需要这两个表中的所有活动名称@njk在下面有一个很好的方法。这个方法非常有效-非常感谢,非常感谢您的帮助:)@user1971251向上投票并接受是stackoverflow中的良好行为。感谢@HamletHakobyan-已经接受,但还太新,无法向上投票;)
select * 
from food f 
left join drink d on f.name = d.name 
where d.status = 'active' and f.status = 'active'
SELECT name, status, MAX(wine) wine, MAX(soda) soda, MAX(dinner) dinner, MAX(dessert) dessert, MAX(fruit) fruit
FROM
  (
    SELECT name, status, wine, soda, NULL dinner, NULL dessert, NULL  fruit
    FROM DRINK WHERE status = 'active'
    UNION ALL
    SELECT name, status, NULL wine, NULL soda, dinner, dessert, fruit
    FROM FOOD WHERE status = 'active'
  ) R
  GROUP BY name, status