【问题标题】:Join two tables where there MAY or may not be values on the second one连接两个表,其中第二个可能有或可能没有值
【发布时间】: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 表上,我会得到所有数据吗?

我知道这更容易,但我的头脑已经在这里呆了一个多星期了:(

谢谢:)

【问题讨论】:

  • 您可能应该在查询中使用左/右连接 (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 ....
  • 尝试左连接并按您想要的列分组,这样您只会得到一行。

标签: php mysql


【解决方案1】:

好的,所以我终于找到了解决方案。 1)我是多余的 2) 我很困惑

我需要解决的问题是:我需要选择公开课程和注册课程 公共课程可能会或可能不会在查询中包含用户,但非公共注册课程必须带来所有数据...

基本上我的查询并没有错。 IT 应该是这样的:

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)

查询检索所有公开的班级,无论用户是否注册,以及他注册的所有其他班级(公共或非公开)以及玩家拥有的班级

简单地说:提出正确的问题是解决查询最重要的事情。

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多