【问题标题】:MySQL join not producing expected results with 'in' functionMySQL join 未使用“in”函数产生预期结果
【发布时间】:2022-01-18 17:48:00
【问题描述】:

我有一个这样的 game_players 表(为简洁起见,省略了其他列):

game_id user_id
1       1
1       3
2       1
2       2
2       4

我的目的是向已登录的用户显示他们所参与的游戏(例如,用户 2 应该只看到游戏 2)。

“where 2 in(select game_players.user_id from game_players)”位似乎不起作用,我得到了所有游戏的列表 - 包括用户 2 未参与的游戏。

select games.game_id as 'game_id', 
    games.date_game_started as 'date_started', 
    users.username as 'username', 
    users.permanent_id as 'permanent_id', 
    game_players.user_id as 'user_id' 
from games 
    inner join game_players on games.game_id = game_players.game_id
    inner join users on game_players.user_id = users.user_id
where 2 in(select game_players.user_id from game_players) 
and games.game_active = 1 
and game_players.current_turn = 1 
group by(games.game_id) 
order by field(game_players.user_id, 2) desc, 
         games.date_game_started asc
    

根据我的测试数据,我得到了这个结果集:

game_id date_started        username    permanent_id    user_id 
1       2021-12-15 13:33:17 userc       userc           3
2       2021-12-15 13:35:20 Admin       admin           1

我应该只获得第二行,因为用户 2 只参与游戏 2。

我承认我的 SQL 有点生疏了,请你帮忙?

【问题讨论】:

  • 没有任何聚合函数的 group by 是没有用的。还添加来自用户和游戏的示例数据
  • 'where 2 in(select game_players.user_id from game_players)' - 总是正确的,因此可能在 game_players.user_id = 2 是你需要的地方毫无意义。

标签: mysql join inner-join


【解决方案1】:

我将其简化/分解并找到了答案。我认为...到目前为止,我对它的测试非常好。

需要改变:

where 2 in(select game_players.user_id from game_players)

到...

where game_players.game_id in(select game_id from game_players where user_id = 2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多