如何在单个查询中使用Common Where子句进行多重选择?

时间:2014-11-30 13:39:18

标签: php mysql sql mysql-select-db

如何为多于1个县的所有值创建单个查询,其中县等于' baawa'。我正在使用PHP连接到数据库。

我尝试了什么:

    SELECT (                
            SELECT * FROM health WHERE county='baawa'
            ),
            (
            SELECT * FROM hotspots WHERE county='baawa'
            ),
            (
            SELECT * FROM markets WHERE county='baawa'
            ),
            (
            SELECT * FROM schools WHERE county='baawa'
            ),
            (
            SELECT * FROM security WHERE county='baawa'
            )

编辑:表格的列数不同。

表格列

健康 facility_id, 名称, 病房里, 地点, LAT, LON, 员工, staff_category, 结构体, 紧急情况下, conflict_cases, communication_facility, 功率


热点 名称, LAT, LON, 病房里, 地点, mgt_committee, 安全, 型


市场 market_id, 名称, 病房里, 地点, LAT, LON, mgt_committee, 安全


学校 全文, 学校ID, 名称, 水平, 病房里, 地点, LAT, LON, 学生们, staff_no, peace_club, conflict_affected


安全 security_id, 名称, 病房里, 地点, LAT, LON, 员工, 结构体, 运输, 通讯, 功率, 犯罪, 分辨率

1 个答案:

答案 0 :(得分:1)

由于SQL查询返回二维行集,因此输出必须具有一致的列集。因此,不可能向几个显着不同的表发出一个查询,并生成包含所有相关表的所有列的输出参见脚注。如果您希望所有列都可用,例如SELECT *会生成,则需要发出5个单独的查询并从单独的查询中获取行。

现有结构可以做些什么:

使用现有结构,要获得所有这些相同的组合行集,您需要chain them together with UNION ALL使用模式:

SELECT col1, col2 FROM health WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM hotspots WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM markets WHERE county = 'baawa'
UNION ALL....
SELECT col1, col2 FROM schools WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM security WHERE county = 'baawa'
/* ORDER BY applies to the whole rowset */
ORDER BY col2 DESC, col1 ASC

问题在于,您只能使用此方法以我在此处完成的简单方式获取所有表中共有的列。查看表结构,我看到的常见列是name, ward, location, lat, lon。因此,您必须在每个UNION组件SELECT中按相同顺序列出它们。

请注意,我在<{1}}查询中使用SELECT *。除非表完全相同,否则最初以完全相同的顺序定义列,UNION将不会以相同的顺序生成列,并且您的输出将没有意义,因为它们不会在SELECT *'d表中对齐。

执行UNION查询时,明确UNION列表中列的顺序非常重要。在您的情况下,无论如何这都是不可能的,因为表格差别很大。

如果您需要在结果查询中包含一个或两个不是所有表共有的列,则可以通过添加{{1来SELECT列表中执行此操作在列不存在的SELECT组件中。例如,{2}存在的NULL列,以及UNION不存在的列:

mgt_committee

脚注:

NULL中包含所有表中所有列的唯一方法是列出所有列的超集,就像我使用/* NULL as mgt_committee where column doesn't exist in table... */ SELECT col1, col2, NULL AS mgt_committee FROM health WHERE county = 'baawa' UNION ALL SELECT col1, col2, mgt_committee FROM hotspots WHERE county = 'baawa' UNION ALL SELECT col1, col2, mgt_committee FROM markets WHERE county = 'baawa' UNION ALL SELECT col1, col2, NULL AS mgt_committee FROM schools WHERE county = 'baawa' UNION ALL SELECT col1, col2, NULL AS mgt_committee FROM security WHERE county = 'baawa' 一样,这意味着所有表中的所有列< / em>必须在SELECT每个组件中表示,mgt_committee替换不存在的列。不要这样做,没有意义。