好的,我知道它必须比我经历的要简单得多......
在一张桌子上,我有可供玩家注册的课程,另一方面,一旦你注册,我在那里注册了玩家。现在,问题在于我想要选择所有公共类和注册类,其中玩家可能或可能不在之前。
如果玩家离开班级,为了保留他们的数据,第二个表只是在注册时将字段更新为“out”,这样的字段显示为“in”
SELECT * FROM k3_pwl_br_classes a JOIN k3_pwl_br_player_class b ON a.class_id=b.class_id WHERE (a.class_privacy = 'public') OR (b.player_id=51 AND b.player_class_status='in') OR (b.player_id=51 AND b.player_class_status='out' AND a.class_privacy='public') OR (a.class_owner=51 AND b.player_id=51) ORDER BY a.class_title, a.class_id
结果是任何可能的组合,所以我在数据库中有3个用户,他们在1级注册但未注册2级
玩家1拥有属于PUBLIC的第1类 玩家46拥有PUBLIC的第2类 玩家51拥有NO级别。
玩家1和46在他们的课程中注册 玩家51在第2课中注册(player_class_status =“in”)但是留下了第1级(player_class_status ='out')
当您以玩家51身份登录时,您会看到第2级第3级和第1级第1级。
如果我删除
(a.class_privacy = 'public')
然后它不会显示任何结果......问题在于当DB使JOIN条件满足4次时...如何选择所有公共类和所有注册类而不重复条目并确保如果player_id在player_class表上,我会获得所有数据吗?
我知道这更容易,但我的头已经在这里待了一个多星期了:(
谢谢:)
答案 0 :(得分:0)
好的,所以我终于找到了解决方案。 1)我多余了 2)我非常困惑
我需要解决的问题是:我需要SELECT公共和注册的类 公共类可能包含也可能不包含查询中的用户,但非公开注册的类必须包含所有数据...
基本上我的查询并没有错。它应该看起来像这样:
SELECT * FROM br_classes a
LEFT JOIN br_player_class b
ON a.class_id=b.class_id AND b.player_id=51
WHERE
(a.class_privacy = 'public')
OR (b.player_id51 AND b.player_class_status='in')
OR (a.class_owner=51)
查询检索所有公开的类,无论是否注册用户,以及他注册的所有其他类(公共或非公开)和玩家拥有的类
如此简单地说:问正确的问题是解决查询的最重要的事情。