我有一個Perl程序,它根據用戶從網頁中選擇的「報告」選項來查詢MySQL數據庫以取回結果。如何製作使用另一個查詢結果的單個MySQL查詢
其中一份報告是學生住房建築的所有居住者申請了停車許可證但尚未獲得停車許可證的人員。
當學生申請許可證時,它會在單個表格行中記錄他們的汽車(製造商,型號,年份,顏色等)的細節。每間公寓最多可容納三名學生,每名學生可申請許可證。所以公寓可能有0張許可證,或者1張,2張或3張許可證,具體取決於其中有多少輛汽車。
我希望能夠做的是執行MySQL查詢,查詢每間公寓中有多少人佔用停車許可證,然後根據查詢結果找出許多許可證已經發布。如果發放的許可證數量少於申請數量,則應在結果集中返回該公寓號碼。它不必指定具體的居住者,只是該公寓至少有一個申請許可證的人,但還沒有收到一個。
所以我有兩個表,一個被稱爲occupant_info
,它包含各種有關乘客的信息,但相關領域有:
counter (a unique row id)
parking_permit_1_number
parking_permit_2_number
parking_permit_3_number
當停車證已被分配,它被記錄在適當的parking_permit_#_number field
(如果它是乘客頭號的許可證,它將被記錄在parking_permit_1_number
等)。
第二個表叫做parking_permits
,包含所有的車輛/車主細節(品牌,型號,年份,車主,車主地址等)。它還包含一個引用occupant_info
表中計數器的字段。
因此,一個例子是:
occupant_info表
counter | parking_permit_1_number | parking_permit_2_number | parking_permit_3_number
--------|-------------------------|-------------------------|------------------------
1 | 12345 | | 98765
2 | 43920 | |
3 | 30239 | | 34233
parking_permits表
counter | counter_from_occupant_info | permit_1_name | permit_2_name | permit_3_name
--------|----------------------------|---------------|-----------------|-------------------
1 |2 | David Jones | James Cameron | Michael Smerconish
2 |3 | Bill Epps | Hillary Clinton | Donald Trump
3 |1 | Joanne Miller | | Sridevi Gupta
我想要一個查詢,將首先看一下在多少乘客公寓已申請許可證。這通過計算parking_permits
表中的名稱來確定。在該表中,第1行有三個名字,第2行有三個名字,第3行有兩個名字。然後查詢應查看occupant_info
表,並從parking_permits
表中查看每個counter_from_occupant_info
,查看是否發出了相同數量的停車許可證。這可以通過比較非空白字段的數量來確定。
使用上面的數據,查詢將看到下列情況:
parking_permit錶行1
Has counter_from_occupant_info equal to "2"
Has three names
The row in occupant_info with counter = "2" has only one permit number issued,
so counter_from_occupant_info 2 from parking_permits should be in the result set.
parking_permit錶行2
Has counter_from_occupant_info equal to "3"
Has three names
The row in occupant_info with counter = "3" has only two permit numbers issued,
so counter_from_occupant_info 3 from parking_permits should be in the result set.
parking_permit錶行3
Has counter_from_occupant_info equal to "1"
Has two names
The row in occupant_info with counter = "1" has two permit numbers issued,
so this row should *not* be in the result set.
我想過使用if
,then
,case
,when
,type logic
爲此在一個查詢,但坦率地說不能換我圍繞如何做到這一點的頭。
我的想法是這樣的:
SELECT
CASE WHEN (SELECT counter_from_occupant_info
FROM parking_permits
WHERE parking_permit_1_name != ""
AND parking_permit_2_name != ""
AND parking_permit_3_name != "") THEN
IF (SELECT parking_permit_1_number,
parking_permit_2_number,
parking_permit_3_number
FROM occupant_info
WHERE counter = ***somehow reference counter from above case statement--I don't know how to do this***
但後來我的頭爆炸,我意識到,我不知道我在做什麼赫克。
任何幫助,將不勝感激。 :-)
Doug
對不起,但這太長了,任何人都會閱讀。請將其降至核心問題。 –
要回答標題的問題:子查詢 – Rogue