MySQL:SELECT 只获取基于 "WHERE x LIKE ' % 的记录?多对多关系中的 %'"

标签 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

最佳答案

您可以在 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/

相关文章:

sql - Ruby on Rails 保存到数据库

在更新所有者表时 hibernate 多对多删除连接表中的条目

mysql - 删除非关系配置中的记录

SQL Developer 和 SQL Programmers 一样吗?

python - 由于模型和数据库不同,无法使用 South 进行迁移

mysql - 具备购买的所有要素

c# - 如何在 EF core 中添加/更新与实体一端的多对多关系

c# - 使用 EF 插入具有多对多关系的操作

java - Spring boot JPA @Query 与 like 和 in

php - 获取一年的记录数