鉴于这些表格:
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
答案 0 :(得分:1)
你可以计算你的子句中缺少的红色和非红色的数量,只选择有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