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
我认为您需要为此使用子查询。也许看看 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 条件。
我有两个表:-
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
我认为您需要为此使用子查询。也许看看 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 条件。