2011-10-13 106 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

我很快就会测试你的版本,并会做出一些性能基准测试。 –

相关问题