给定这些表:
board_game
----------
id name genre
1 The Game Strategy
2 The Game: Limited Edition Strategy
board_game_piece_missing
------------------------
board_game_id piece_id missing_quantity
1 1 2
1 2 3
1 3 1
2 1 1
piece
-----
id name color
1 Soldier Red
2 Ghost Green
3 Ghost Soldier Red/Green
假设我只想找到缺少红色棋子的策略棋盘游戏(意味着红色/绿色幽灵士兵棋子不算数)。在这种情况下,我应该只找到游戏 2(游戏:限量版),因为唯一缺少的部分只有红色,如下所示:
id name genre
2 The Game: Limited Edition Strategy
我将如何构建一个查询(最好)或最多两个查询来执行此操作?
这是我目前的查询,以防万一我做错了什么:
SELECT b.id, b.name, b.genre
FROM board_game b
LEFT JOIN board_game_piece_missing bp ON b.id = bp.board_game_id
LEFT JOIN piece p ON bp.piece_id = p.id
WHERE b.genre = 'Strategy'
-- Insert missing piece SQL here --
GROUP BY d.id
最佳答案
您可以在 having 子句中计算缺失红色和非红色颜色的数量,并且只选择具有 0 个非红色缺失颜色和 1 个或多个红色缺失颜色的游戏
SELECT b.id, b.name, b.type
FROM board_game b
JOIN board_game_piece_missing bp ON b.id = bp.board_game_id
JOIN piece p ON bp.piece_id = p.id
WHERE b.genre = 'Strategy'
GROUP BY b.id
HAVING SUM(p.color <> 'Red') = 0
AND SUM(p.color = 'Red') > 0
关于MySQL:SELECT 只获取基于 "WHERE x LIKE ' % 的记录?多对多关系中的 %'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975686/