【问题标题】:JOIN single attribute with multiple table and merge result将单个属性与多个表连接并合并结果
【发布时间】:2021-01-21 21:53:27
【问题描述】:

我会将我的表格通知加入 2 个不同的表格,让我举一个类似的例子。

通知:

ID | player_id | item_id | .... 

篮球运动员的物品

player_id | item_id | note | points | rebounds

足球运动员的物品

player_id | item_id | note | match | goal 

重要提示:所有球员 ID 都是唯一的,足球运动员的格式为 1********,篮下的球员的格式为 5************。所以所有的情侣 player_id - item_id 也是独一无二的。

结果应该是这样的表格:

id | player_id | item_id | note | attr1 | attr2

在“note”中,有两种玩家的注释,“attr1”由分数填充或匹配取决于玩家类型(相同类型。INT)

此外,这些项目可以与 SOCCER_ITEMS 和 BASKET_ITEMS 表连接,其中包含有关项目本身的信息。此 JOIN 可以创建重复的行,因为 item_id 在 2 个表之间不是唯一的,因此篮子项目可以与足球项目的信息连接,从而产生问题。

是否可以以 SQL 中呈现的方式收集数据?我在用PHP写代码(不知道有没有用)

【问题讨论】:

  • 似乎您只需要明确选择SELECT 子句中的列,而不是使用* 选择所有内容。你能分享一下你试过的查询吗?
  • 上面的表格是示例,但查询类似于:code SELECT n.id, n.player_id, n.item_id, b.note, s.note FROM notifications n LEFT JOIN football s ON s.player_id = n.player_id AND s.item_id = n.item_id 左加入篮子 b ON b.player_id = n.player_id AND b.item_id = n.item_id code 结果:code n.id | n.player_id | n.item_id | b.注意 |例如,s.note code 2 列用于不同的“注释”列,而不是包含所有结果的列
  • 在 attr1 中你想要列点数还是比赛,在 attr2 列中是篮板还是进球等等,具体取决于球员的类型?

标签: php mysql sql


【解决方案1】:

你可以使用函数COALESCE():

SELECT n.id, n.player_id, n.item_id, 
       COALESCE(s.note, b.note) note,
       COALESCE(s.match, b.points) attr1, 
       COALESCE(s.goal, b.rebounds) attr2
FROM notifications n 
LEFT JOIN soccer s ON s.player_id = n.player_id AND s.item_id = n.item_id 
LEFT JOIN basket b ON b.player_id = n.player_id AND b.item_id = n.item_id

【讨论】:

  • 谢谢@forpas,它可以部分解决问题。这样可以避免 NULL 列,但由于与 items 表的 JOIN,仍然存在可能的重复问题。
  • @SWeC 什么是项目表?
  • 还有另外 2 个表,我在通知中左键加入,它们是某些结果行可以重复的原因: SOCCER_ITEMS: ID | item_name | some attr BASKET_ITEMS: ID | item_name | some attr 问题是由于两个表中可以相同的 ID。现在,我已经解决了从两个表之间有很大间隔的不同点更改 AUTOINCREMENT ID 的两个表的起始值。但我正在寻找一种可能的解决方案来避免这种工作。
  • 我的回答中的查询是关于您最初发布的问题。如果您有新要求,可以发布新问题。
猜你喜欢
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2017-12-22
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多