0

我如何为县等于“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'
            )

编辑:表格有不同的列数。

表格列:

卫生 设施_id、名称、病房、位置、纬度、经度、员工、员工类别、结构、紧急情况、冲突案例、通信设施、电源


热点 名称、纬度、经度、病房、位置、mgt_committee、安全性、类型


市场 market_id、名称、病房、位置、纬度、经度、mgt_committee、安全


学校 全文、school_id、姓名、级别、病房、位置、纬度、经度、学生、staff_no、peace_club、conflict_affected


安全 security_id、姓名、病房、位置、纬度、经度、员工、结构、运输、通信、权力、犯罪、决议

4

1 回答 1

1

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

您现有的结构可以做什么:

使用您现有的结构,要获得所有这些相同的组合行集,您需要使用以下模式将它们链接在一起: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.

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

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

如果您需要在结果查询中包含并非所有表共有的一或两个其他列,您可以通过在该列不存在的组件中SELECT添加 aNULL在列表中执行此操作。UNION例如mgt_committee,它存在的 2 列和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'

脚注:

将所有表中的所有列包含在一个中的唯一方法是SELECT像我一样列出所有表的超集mgt_committee,这意味着所有表中的所有列都必须在 的每个组件中表示UNION,并NULL替换不包含的列存在。不要这样做,这没有意义。

于 2014-11-30T13:55:38.823 回答