选择m:n与另一个表中的记录相关的数据库记录

时间:2011-10-13 19:48:59

标签: sql database relationship

我正在尝试从表A中选择与表B中的某些X记录相关的所有记录(m:n关系)。 这些是我的表格:

  

hs_hotels:   id - name

     

hs_hotel_options:   hotel_id - option_id

     

hs_options:   id - name

现在我有,比如3,来自表hs_options的某些记录的ID,我正在寻找表hs_hotels中与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...但当然这不起作用。

你有什么想法怎么做?提前谢谢!

2 个答案:

答案 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是否支持此子查询语法。

答案 1 :(得分:2)

与Tom H.相似,您需要计算选项,然后将其与酒店联系起来。

您可以使用inner join existsIN。我选择了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