簡體   English   中英

如何在單個查詢中使用公共where子句進行多項選擇?

[英]How to Make Multiple Select with a Common Where Clause in Single Query?

如何為一個縣等於“ 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,姓名,級別,病房,位置,經緯度,lon,學生,staff_no,peace_club,conflict_affected


安全性security_id,名稱,病房,位置,緯度,經度,工作人員,結構,運輸,通訊,權力,犯罪,決議

由於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中以相同的順序列出它們。

請注意,我不在 UNION查詢上使用SELECT * 除非表完全相同 ,並且原先以完全相同的順序定義了列,否則SELECT *將不會以相同的順序產生列,並且您的輸出將無意義,因為它們未在UNION對齊表。

在進行UNION查詢時,重要的是要明確有關SELECT列表中列的順序。 對於您而言,這是不可能的,因為表格存在很大差異。

如果需要在結果查詢中包括一個或兩個其他表(並非所有表都共有),則可以SELECT列表中通過在不存在該列的UNION組件中添加NULL 做到這一點。 例如,存在的mgt_committee 2,不存在的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'

腳注:

將所有表的所有列包含在一個SELECT的唯一方法是像我對mgt_committee所做的那樣列出所有表的超集,這意味着所有表中的所有列都必須在UNION 每個組件中表示,用NULL替換列那不存在。 不要這樣做,這是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM