【问题标题】:Joining tables only if column has a value set?仅当列设置了值时才连接表?
【发布时间】:2020-11-12 09:25:53
【问题描述】:

我会简化表格,但我基本上有一个名为sheet的表格,它可以分配给一个或两个people;所以我将这些存储在工作表中;

sheet
-----
sheet_id
value
person_1_id
person_2_id

我有这样的人员表;

people
------
person_id
name

所以我希望能够通过分配给他们的人的 ID 加载工作表,并加入到人员表中以获取他们的姓名。所以说我在找person_id: 2

SELECT s.*, p.*, p2.* FROM sheet s 
JOIN people p ON s.person_1_id = p.person_id
JOIN people p2 ON s.person_2_id = p.person_id
WHERE person_1_id = 2 OR person_2_id

我想从查询中返回一致的 json 对象,因此从其中一个连接返回重复的字段似乎非常浪费。我只想加入 person_id WHERE person_id 在工作表中设置。它可能分配了两个人,但我只会按 ONE person_id 加载结果。

类似

{ sheet_id: 1, value: 1000, person_id: 2, name: 'John' }

我只想加入工作表中的列有值的地方,如果它不是整数,它将为 NULL。

我确实考虑过将这一切都转移到另一个表格中,例如 sheet_to_person;但这会使工作表的所有插入和更新变得非常复杂,因为表格等上需要两个插入。

【问题讨论】:

  • 最好有一个sheet_person ( sheet_id int, person_id int ) 表并加入它。这将使所有查询变得更好。

标签: mysql sql


【解决方案1】:

嗯。 . .做你想做的一种方法是:

SELECT s.*, p.*
FROM sheet s JOIN
     people p
     ON p.person_id = COALESCE(s.person_1_id, s.person_2_id);

不过,一般来说,ON 子句中的函数通常会影响性能。

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 2018-09-08
    • 1970-01-01
    • 2020-04-03
    • 2013-04-16
    • 2012-03-10
    • 1970-01-01
    • 2018-09-24
    • 2016-02-29
    相关资源
    最近更新 更多