2011-10-13 138 views
0

我試圖從表A中選擇與表B中的某些記錄(m:n關係)相關的所有記錄。 這些都是我的表:選擇與另一個表中的記錄m:n相關的數據庫記錄

hs_hotels: ID - 姓名

hs_hotel_options: HOTEL_ID - option_id

hs_options: ID - 姓名

現在我,讓我們說3,來自表hs_options的某些記錄的ID和我正在查找與給定記錄相關的表hs_hotels中的所有記錄fr om hs_options也適合其他條件。最後,我想要一組來自hs_hotels的記錄。

這是我目前的嘗試:

SELECT `hs_hotels`.* 
FROM `hs_hotels` 
RIGHT JOIN `hs_hotel_options` ON (`hs_hotels`.`id` = `hs_hotel_options`.`hotel_id`) 
WHERE `hs_hotel_options`.`option_id` IN (1, 3, 5) 
GROUP BY `hs_hotel`.`id` 

1,3和5是從表hs_options記錄的ID。這只是從hs_hotels中選擇所有記錄,這些記錄與hs_options中3個給定記錄中的1個相關,而不是全部3個記錄。我的問題是我不知道如何解決這個問題。我可以嘗試選擇所有記錄WHERE option_id = 1 AND option_id = 3 AND...,但當然這不起作用。

你有什麼想法如何做到這一點?提前致謝!

+0

你用什麼db? – maks

+1

爲什麼你在這個查詢中執行外連接?如果在hs_hotel中沒有任何帶有指定id的酒店,那麼在hs_hotel_option中不會有任何具有指定hotel_id的記錄。據我瞭解這是一個業務規則的要求。嘗試刪除外部聯接,並在此僅使用內部聯接,因爲要執行的查詢的結構是正確的 – maks

+1

您有RIGHT JOIN,但後來在「RIGHT」表上執行了WHERE子句。這具有將RIGHT JOIN轉換爲INNER JOIN的效果。 –

回答

2

與Tom H.'s類似,您需要計算選項並將其與酒店相關聯。

您可以使用inner joinexistsIN。我選擇了INNER JOIN

SELECT 
    * 
FROM 
    Hotels H 
    INNER JOIN (
     SELECT 
     hotel_id 
     FROM 
     hs_hotel_options 
     WHERE 
     option_id IN (1, 3, 5) 
     GROUP BY 
     hotel_id 
    HAVING COUNT(*) = 3) req_options 
    ON h.hotel_id = req_options.hotel_id 
+0

可以使用沒有組的子句嗎? – maks

+0

Doh!固定感謝 –

+0

謝謝,我實施了你的,它似乎工作得很好。 –

2
SELECT 
    <column list> 
FROM 
    Hotels H 
WHERE 
    ( SELECT COUNT(*) 
     FROM 
      Hotel_Options HO 
     WHERE 
      HO.hotel_id = H.hotel_id AND 
      HO.option_id IN (1, 3, 5) 
    ) = 3 

我不知道在你的RDBMS下是否支持這個子查詢語法。

+0

我很快就會測試你的版本,並會做出一些性能基準測試。 –

相關問題