MySQL:SELECT仅在多对多关系中基于“WHERE x LIKE'%?%'”获取记录

时间:2014-07-26 21:27:08

标签: mysql sql many-to-many where-clause

鉴于这些表格:

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

1 个答案:

答案 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