【发布时间】:2018-02-05 16:42:14
【问题描述】:
好的,我知道它一定比我经历的要简单得多......
在一张桌子上,我有可供玩家注册的可用课程,在另一张桌子上,一旦您注册,我就会在那里注册玩家。现在,问题出在我想选择玩家之前可能或可能没有的所有公共课程和注册课程。
如果一个玩家离开了班级,为了保留他们的数据,如果她被录取,第二个表只会更新一个字段为“out”,该字段读取为“in”
SELECT * FROM k3_pwl_br_classes 加入 k3_pwl_br_player_class b ON a.class_id=b.class_id 在哪里 (a.class_privacy = '公共') 或(b.player_id=51 和 b.player_class_status='in') 或(b.player_id=51 AND b.player_class_status='out' AND a.class_privacy='public') 或(a.class_owner=51 和 b.player_id=51) ORDER BY a.class_title, a.class_id结果是任何可能的组合,所以我在数据库中有 3 个用户,他们注册了 1 类但没有注册 2 类
玩家 1 拥有等级 1,即 PUBLIC 玩家 46 拥有 2 类,即 PUBLIC 玩家 51 没有任何职业。
玩家 1 和 46 已注册他们的班级 玩家 51 已注册 (player_class_status="in") 在第 2 班但离开第 1 班(player_class_status='out')
当您以 51 号玩家身份登录时,您会看到 2 级 3 次和 1 级一次。
如果我删除
(a.class_privacy = 'public')
然后它不会显示任何结果...问题在于当数据库进行 JOIN 条件满足 4 次...我如何选择所有公共课程和所有注册课程而不重复条目并确保如果 player_id 在 player_class 表上,我会得到所有数据吗?
我知道这更容易,但我的头脑已经在这里呆了一个多星期了:(
谢谢:)
【问题讨论】:
-
试试
LEFT JOIN? (mysqltutorial.org/mysql-left-join.aspx) -
您可能应该在查询中使用左/右连接 (dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html)。我不确定我是否理解您的问题,与班级/玩家的表格会有所帮助
-
我已经添加了所有可能的 JOINS 并且没有任何工作 :( LEFT 或 RIGHT 只给我 4 行或没有行...我每个班级只需要一行,如果这样的玩家已经注册或已经注册在类中,该数据如果我使用 LEFT JOIN 它会从其他玩家那里获取数据,这不好,如果玩家 51 从未在该类中,则此类字段应该为空或为 NULL
-
也许可以反转您的查询:
SELECT * FROM k3_pwl_br_player_class AS b JOIN k3_pwl_br_classes AS a ON .... -
尝试左连接并按您想要的列分组,这样您只会得到一行。