Mysql 如何将这些SQL SELECT查询组合到一个SELECT语句中

Mysql 如何将这些SQL SELECT查询组合到一个SELECT语句中,mysql,syntax,select,union,Mysql,Syntax,Select,Union,如何将这两个select语句组合到一个查询中: SELECT SUM( incidents ) AS fires, neighborhoods AS fire_neighborhoods FROM ( SELECT * FROM `fires_2009_incident_location` UNION ALL SELECT * FROM `fires_2008_incident_location` UNION ALL SELECT * FROM `fires_2007_incident

如何将这两个select语句组合到一个查询中:

SELECT SUM( incidents )  AS fires, neighborhoods AS fire_neighborhoods
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location`
UNION ALL SELECT * 
FROM `fires_2007_incident_location`
UNION ALL SELECT * 
FROM `fires_2006_incident_location`
) AS combo
GROUP BY fire_neighborhoods ORDER BY fires DESC



SELECT SUM( incidents )  AS adw, neighborhoods AS adw_neighborhoods
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo2
GROUP BY adw_neighborhoods ORDER BY adw DESC
因此,我希望返回查询,类似于:

fire_neighborhoods  fires  adw_neighborhoods  adw
xyzNeighborhood     6      abcNeighborhood    22
jklNeighborhood     3      tuvNeighborhood    40
我只想简单地结合上面两个查询的结果。这两个查询彼此独立。一个查询的结果不会影响另一个查询的结果。我只需要一种方法将两个结果合并为一个

如果有人有任何建议,请告诉我

多谢各位


-Laxmidi

如果我正确理解您的需求,您可以将查询合并在一起,添加一列,让您知道它来自哪个查询:

SELECT SUM( incidents )  AS fires_or_adw, neighborhoods AS fire_or_adw_neighborhoods, 'Fires' as which_query
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location`
UNION ALL SELECT * 
FROM `fires_2007_incident_location`
UNION ALL SELECT * 
FROM `fires_2006_incident_location`
) AS combo
GROUP BY fire_neighborhoods ORDER BY fires DESC

UNION

SELECT SUM( incidents )  AS fires_or_adw, neighborhoods AS fire_or_adw_neighborhoods, 'ADW' as which_query
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo2
GROUP BY adw_neighborhoods ORDER BY adw DESC

假设您的行数是原来的两倍,并且一半的数据将为空,但是像您的示例中那样将结果“砰砰”地放在一起是不常见的。

您给出的示例表明您希望水平组合查询,但后来您声明它们是完全独立的。这些语句相互冲突,因为当记录彼此相关时,通常会水平组合数据。下面是我横向组合它们的想法,但我也记下了我纵向组合它们的想法

这取决于你想如何把它们联系起来。如果您是基于邻居进行查询,则可以在fire_Neighbories=adw_Neighbories上的两个较大查询之间进行连接,例如:

SELECT fire_neighborhoods, fires, adw
FROM (

SELECT SUM( incidents )  AS fires, neighborhoods AS fire_neighborhoods
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location`
UNION ALL SELECT * 
FROM `fires_2007_incident_location`
UNION ALL SELECT * 
FROM `fires_2006_incident_location`
) AS combo
GROUP BY fire_neighborhoods ORDER BY fires DESC

) AS fires
    INNER JOIN (  

SELECT SUM( incidents )  AS adw, neighborhoods AS adw_neighborhoods
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo2
GROUP BY adw_neighborhoods ORDER BY adw DESC

) AS adw
    ON fires.fire_neighborhoods = adw.adw_neighborhoods
这只是一个例子。您可能需要一个不同的连接或其他东西来让它为您工作


现在,您声明这两个查询是独立的,并且不会相互影响。如果它们确实没有共同点,您应该在每个查询中添加一列,指明它来自哪个查询(例如,对于fire查询,添加一个常量值为1的列;对于adw查询,添加一个常量值为2的列)。然后,将两个大型查询合并在一起。这将以垂直方式而不是水平方式将它们组合起来。

其他人给出的关于使用鉴别器列的答案与您的要求类似,但为了以防万一,可以将虚拟占位符列添加到联合中,如下所示:

SELECT 
    SUM( incidents )  AS fires, 
    neighborhoods AS fire_neighborhoods,
    0 as adw,
    '' as adw_neighbourhoods
FROM ( 
    SELECT *  
    FROM `fires_2009_incident_location`  
    UNION ALL SELECT *  
    FROM `fires_2008_incident_location` 
    UNION ALL SELECT *  
    FROM `fires_2007_incident_location` 
    UNION ALL SELECT *  
    FROM `fires_2006_incident_location` 
) AS combo 
GROUP BY fire_neighborhoods ORDER BY fires DESC 

UNION 

SELECT 
    0 as fires,
   '' as fire_neighbourhoods,
    SUM( incidents )  AS adw, 
    neighborhoods AS adw_neighborhoods 
FROM ( 
    SELECT *  
    FROM `adw_2009_incident_location`  
    UNION ALL SELECT *  
    FROM `adw_2008_incident_location` 
    UNION ALL SELECT *  
    FROM `adw_2007_incident_location` 
    UNION ALL SELECT *  
    FROM `adw_2006_incident_location` 
) AS combo2 
GROUP BY adw_neighborhoods ORDER BY adw DESC

并排显示两个不相关的查询通常是报表软件的工作,而不是SQL引擎的工作。这里的问题是,您要求查询工具执行它不适合执行的操作:显示格式

关系(从根本上说,选择的结果应该是什么)是一种对世界状态做出断言的数据结构。每行定义一系列(理想情况下)为真的命题


在您的问题中,这些行包含任意的事实陈述,这些事实彼此之间没有关联,也无法陈述任何命题。

感谢您帮助我们解决这个问题。向David Hall、Aaron、Jeffrey Whitledge&NYSystems分析师大声呼喊。我选择了虚拟列选项:

SELECT SUM( incidents ) , neighborhoods,  'adw' as offense 
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo 
GROUP BY neighborhoods  
UNION ALL
SELECT SUM( incidents ), neighborhoods,  'fire' as offense 
FROM (
SELECT * 
FROM `fire_2009_incident_location` 
UNION ALL SELECT * 
FROM `fire_2008_incident_location`
UNION ALL SELECT * 
FROM `fire_2007_incident_location`
UNION ALL SELECT * 
FROM `fire_2006_incident_location`
) AS combo2
GROUP BY neighborhoods 

我一定错过了什么。为什么不能将这两个查询合并在一起?可以发布表的结构吗?为什么人们投票支持这个问题?这个问题真的有用吗?这对我来说似乎相当学术和多余。@Jim G:责怪选民徽章:为什么模式每年映射一个表?这些是视图吗?嗨,Aaron,我想我不需要水平返回数据。我可以添加一个列,指示是火灾还是adw,然后让其他列显示邻居和事件-Laxmidhi Aaron,我忘了在上一封邮件中说“谢谢”。对不起-杰弗里,你说得对。水平返回数据是没有意义的。谢谢-嗨,大卫,谢谢你的留言。我试过你的建议,但不幸的是,我没能把它付诸实施。可以在mySQL中添加虚拟列吗-Laxmidi@Laxmidi-运行该语法时是否看到错误?我不确定mySQL,尽管我希望它能工作。Tour问题被某人重新标记为tsql,这是microsoft sql实现,我现在将重新标记它。您好,NYSystemsAnalyst,感谢您建议添加带有常量的列。我最终可能会那样做-拉西米地