【问题标题】:MySql join statement with all rows in left tableMySql join 语句与左表中的所有行
【发布时间】:2016-07-26 12:36:15
【问题描述】:

假设我有三个表:

1. Fields
ID
NAME

2. DATA
ID
f_id
p_id
data

3. PROJECT
ID

而且我每次都需要使用不同的数据从字段表中选择所有行(取决于我需要什么项目) 所以每次我都会有所有的字段行,如果项目 X 没有某些字段的数据,它将返回空行。

我尝试了以下 SQL 语句:

SELECT * FROM field as f 
left data as d on f.ID = d.f_id
WHERE d.p_id = 'X'

这将只返回项目 X 有一些数据的行,如果没有数据则不会返回空行。

我也试过了:

SELECT * FROM field as f 
left join data as d on f.ID = d.f_id
left join project as p on p.ID = d.p_id

这将返回字段中的所有行,但也会返回其他项目数据,如果我添加 Where 语句,如果项目没有数据,则不会返回空行。

我也试过了:

SELECT * FROM field as f 
left join data as d on f.ID = d.f_id
left join project as p on p.ID = d.p_id
WHERE (p.ID == 'x' || p.ID is null) 

但是只有当这些行没有被其他项目使用时才会返回字段行,如果有其他项目使用它的字段,所以我不会得到这个字段。 (没有从左表中获取所有行)

如果项目没有数据,我怎样才能从左表(字段)中选择所有行?

【问题讨论】:

  • 可怕的表名、字段和数据...
  • 仅供示例,非实名@jarlh

标签: mysql sql select join left-join


【解决方案1】:

好的,让我看看,首先我会这样做:

    SELECT F.* FROM field F 
    LEFT data D ON F.id = D.f_id
    WHERE D.p_id = 'X';

因为你说你只想要表格字段中的数据,对吧?如果您将 * 留在那里而没有表前缀,它将为您提供您在连接中拥有的每个表上的所有数据,并且由于每个表上的列 ID,您可能会遇到模棱两可的错误。

另一件事,我把 AS 去掉了,因为它通常更适用于在列名上放置别名,例如:

    "COUNT(ID) AS COUNTER"

我很抱歉,但在我看来,问题可能就是解决方案。为什么要选择空行?你是指列还是行?

【讨论】:

    【解决方案2】:
    SELECT * 
    FROM Fields AS F LEFT JOIN DATA AS D ON 
         F.ID=D.ID LEFT JOIN PROJECT AS P ON F.ID=P.ID
    

    【讨论】:

    • 用你的答案提供一些解释。
    【解决方案3】:
    SELECT * FROM field as f 
    left join data as d on f.ID = d.f_id
    WHERE ISNULL(d.p_id,'X') = 'X'
    
    SELECT * FROM field as f 
    left data as d on f.ID = d.f_id
    WHERE (d.p_id = 'X' or d.p_id is null)
    

    【讨论】:

    • 用你的答案提供一些解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2023-03-25
    相关资源
    最近更新 更多