MYSQL 查询一对多关系

MYSQL query for one to many relation

我有两个表:-

1-

id    name   location_id
1     demo1     20
2     demo2     34

2- 便利设施

id    amenity_id   amenity_type object_id object_type

1   wedding_hall    venue_type     1          section

2  conference_hall  venue_type     1          section

3  conference_hall  venue_type     2          section

我想要所有 location_id 为 134 且同时拥有 wedding_hall 和会议厅的部分。我试过这个查询:-

    SELECT s.* from section s 
    INNER JOIN amenities am 
  on (am.object_type='section' AND am.object_id=s.id) 
WHERE s.location_id=134 AND 
(am.amenity_type LIKE 'venue_type' and am.amenity_id='wedding_hall') 
AND (am.amenity_type LIKE 'venue_type' and am.amenity_id='conference_hall')

如果我执行此查询:-

     SELECT s.* from section s 
 INNER JOIN amenities am 
on (am.object_type='section' AND am.object_id=s.id)
 WHERE s.location_id=134 AND 
(am.amenity_type LIKE 'venue_type' and am.amenity_id='wedding_hall')

那么它只适用于一种便利设施。 这里是 sqlfiddle

我怎样才能更正我的查询?

如果我没有弄错你的问题,而你真的想要 id = 1 的部分,试试这个:

SELECT s.*
FROM section s
INNER JOIN amenities am
ON am.object_type='section' AND am.object_id=s.id
WHERE s.location_id=134
AND am.amenity_type LIKE 'venue_type'
AND am.amenity_id IN ('wedding_hall', 'conference_hall')
-- HAVING COUNT(DISTINCT am.amenity_id) > 1
GROUP BY s.id
HAVING COUNT(DISTINCT am.amenity_id) = 2

SQLFiddle Demo

我认为您需要为此使用子查询。也许看看 EXISTS 条件。如果该部分同时具有婚礼大厅和会议厅(但如果您只有两个婚礼大厅,并且它与多个部分一起工作,则不会),以下内容将为您提供所需的结果:

SELECT DISTINCT s.* FROM section s
    INNER JOIN amenities a
    ON a.object_id = s.location_id
        WHERE s.location_id = 134
    AND EXISTS(SELECT * FROM amenities WHERE object_id = s.location_id AND amenity_id = 'wedding_hall')
    AND EXISTS(SELECT * FROM amenities WHERE object_id = s.location_id AND amenity_id = 'conference_hall');

也许可以在 WHERE 子句中添加 amenity_type 和 object_type 条件。