2013-04-24 85 views
0

我有我的SQL DB和使用PHP來訪問它。mySQL查詢與聯接和計數

我的表是這樣的:

航班表航班號,時間,機場

座位表 航班號,座位號

我有以下查詢:

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' FROM flights f, seats s GROUP BY f.FlightID 

我想要輸出要預訂

ID民席書

航班號座位

的問題是目前它顯示了這一點:

[{"ID":"0","Seats Booked":"37"},{"ID":"1234","Seats Booked":"37"}] (The output is JSON encoded) 

當它應該是像10和27如果你跟着我?它似乎不正確的連接。

請給出一個解釋我做錯了什麼,而不僅僅是一個答案。

謝謝!

+1

建議:請不要在名稱中使用空格。 – 2013-04-24 18:27:02

回答

3

LMC,

您沒有使用該條款,使加盟。這就是爲什麼你得到每個分組指令的總和。

使用你的語法應該是這樣的正確的指令:

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' 
FROM flights f, seats s 
where s.FlightId = f.FlightId 
GROUP BY f.FlightID 

使用內部聯接語法應該是這樣的:

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' 
FROM flights f 
inner join seats s 
on s.FlightId = f.FlightId 
GROUP BY f.FlightID 

你可以做的事情,而無需使用飛行表。飛行表沒有任何區別,因爲你正在返回一組飛行體。桌上的座位已經飛過了。以下聲明應該足夠了。如果你不關心不航班預訂座位

SELECT s.FlightID 'ID', Count(*) 'Seats Booked' 
FROM seats s 
GROUP BY s.FlightID 

如果沒有預訂座位,你想展示飛行,那麼你應該使用左連接到航班這是真實的。以下聲明將解決此問題。

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' 
FROM flights f 
left join seats s 
on s.FlightId = f.FlightId 
GROUP BY f.FlightID 
+0

爲什麼這比內部查詢更好?哪種瓶胚更好? – LmC 2013-04-24 18:08:31

+0

我編輯了我的帖子。看看最後的聲明。您不需要加入只檢索預訂的航班和座位數 – 2013-04-24 18:12:27

+0

@JoseAreas如果他想從* all *航班預訂座位,那麼他會希望JOIN確保只有在航班ID存在的情況下才能預訂座位在航班表 – 2013-04-24 18:15:27

1

首先,您應該使用下面顯示的連接語法,因爲您的語法有點過時。 其次,一定要包括where條款

SELECT f.FlightID 'ID', count(*) as "seat count" 
INNER JOIN seats s On 
f.FlightID = s.FlightID 
Where f.FlightID = 'some_id' 
GROUP BY f.FlightID 
+0

啊我現在明白了,所以它需要一個內部查詢?爲什麼是這樣?沒有一個可以做到嗎?很好的答案! – LmC 2013-04-24 18:01:33

+0

@LmC如果您不使用子查詢,count將只選擇* entire *查詢返回的總行數,並將其用於每行。 – 2013-04-24 18:02:31

+0

那麼這是做到這一點的最佳方式? – LmC 2013-04-24 18:04:47

1

這裏跟你的做法是,你不參加你的表的問題。我加入的意思是「表1」與「表2」有一些關係。在你的情況下,它是航班編號。因此,在另一張表(座位表)中,您將擁有座位數據,但是可用於任何特定的航班。因此,爲了獲得相匹配的記錄,您需要根據飛行體加入兩張表,以便爲每次飛行獲得不同數量的座位。

試試這個sql。

select f.flightid as 'id', count(s.seat_number) as seats_booked 
from flight f, seats s 
where f.flightid=s.flightid 
group by f.flightid 
+0

爲什麼這比內部查詢更好?哪種瓶胚更好? – LmC 2013-04-24 18:09:02

+1

它既不好也不差。這只是一種替代語法,與內部連接完全相同 – 2013-04-24 18:10:25

+0

@LmC:在任何sql語句中,執行從底部開始,最後選擇行。所以在你的解決方案中,當選擇發生時另一個sql正在執行。所以需要更多時間來執行。應該避免這種做法。 – ankurtr 2013-04-24 18:10:42

2

如果你不需要什麼比航班號從多個航班表,爲什麼不這樣做:

SELECT s.FlightID,COUNT(s.id)FROM席氏集團BY s.FlightID

如果您還需要計算有沒有座位的航班,使用此:

SELECT f.flightID,COUNT(S。 ID)FROM航班f LEFT JOIN座位s ON s.flightID = f.flightID GROUP BY f.flightID

+0

因爲加入會從航班表中航班ID存在的座位表中選擇所有座位。 – 2013-04-24 18:16:03

+0

你是對的。如果需要零座位,那麼當然只能使用連接。但內部連接不是一個解決方案,無論如何 – 2013-04-24 18:17:40

+0

我更新了我的答案。這裏應該使用LEFT JOIN來考慮有0個座位的航班 – 2013-04-24 18:21:29