2017-09-06 46 views
1

我有一個航班表和預訂表。MySQL - 凡存在關係添加一個地方,忽略如果不存在

航班有一欄,max_passengers

機票必須在預訂表的方式預訂引用

我在laravel/PHP中使用這一點,但我期待與實際的SQL,因爲幫助flight_id其讓我有點糊塗,我可以現在查詢航班,並通過使用sum(bookings.places_booked)然後sumtracting從max_passengers這個數字計算出的左側免費名額,但我怎麼能寫SQL,做:

  • 隨機選擇航班
  • 如果預訂都對這次飛行總和的預訂名額的量和添加其中< max_passengers

我能做到這一點的一部分,但你怎麼能做到,所以如果沒有預訂都反對由飛行加入/哪裏成爲可選的,並不重要,因爲max_passengers將是免費的地方的數量。

我曾想過在航班表中增加一個free_places列,但它會出現當前設置避免的問題。

SELECT flights.*, bookings.* 
FROM flights 
LEFT JOIN bookings ON flights.id = bookings.flight_id 
WHERE sum(bookings.places_booked) < flights.max_passengers 
GROUP BY flights.id 
ORDER BY flights.id ASC 

這是我想才達到的事情,但正如我所說,我不知道如何使加盟/其中可選的,所以在沒有關係存在不要緊有關檢查。

EDIT(最終SQL):

SELECT flights.*, bookings.* 
FROM flights 
LEFT JOIN bookings ON flights.id = bookings.flight_id 
GROUP BY flights.id 
HAVING COALESCE(sum(bookings.places_booked),0) < flights.max_passengers 
ORDER BY RAND() 
LIMIT 1 

回答

2

兩件事情:
1)您應使用HAVING條款,而不是WHERE子句聚合功能(查詢應該拋出一個錯誤)。

2)使用COALESCE()將值從NULL替換爲實際值。這是您的查詢無法正常工作的第二個原因。當沒有匹配時,bookings.places_booked爲空,則條件呈現爲NULL < flights.max_passenger,這將始終爲假。

GROUP BY flights.id 
HAVING COALESCE(sum(bookings.places_booked),0) < MAX(flights.max_passengers) 
ORDER BY flights.id