【问题标题】:MySQL join for this specific scenario针对此特定场景的 MySQL 连接
【发布时间】:2009-03-17 03:34:16
【问题描述】:

我在使用 MySQL 连接时遇到问题。

Table_A:

 A_id  Cost1  A1_id  Cost2
 1     500     0     200
 1     100     1     100
 1     50      2      60
 1     10      3      50
 2      5      0      10

Table_B(参考B_id:来自Table_AA1_id):

 B_id  FName  LName
 1     X      A
 2     Y      B
 3     Z      C

Table_C(参考C_id:来自Table_AA_id):

C_id  Towns

 1    Atlanta
 2    NewYork

我需要合并所有三个表,如下输出:

  • 我提取与(Table_A.A_id=Table_C.C_id) 匹配的Towns
  • 我提取与(table_A.A1_id=Table_b.b_id) 匹配的Fname,Lname
  • 如果A1_id != 0,我需要跳过Towns
  • 如果A1_id == 0,我需要跳过Fname,Lname

剩余的数据可能是一个值或空值,我将其指定为“#”。 对于给定的场景,什么是高效的 MySQL 查询?

输出:

A_id  Cost1  A1_id cost2 Fname Lname Towns
1     500     0    200    #     #    Atlanta
1     100     1    100    X     A     #
1      50     2     60    Y     B     #
1      10     3     50    Z     C     #

【问题讨论】:

  • 您的输出令人困惑。如果你想“跳过 A1_id == 0”,那么第一行不应该是查询输出的一部分。
  • 我必须支持 @enobrev 的评论 - 如果示例输出包含 A1_id == 0 的行,“如果 A1_id == 0 则跳过”是什么意思。
  • 还有,既然A_id = 1在每一行输出中,为什么亚特兰大没有出现在每一行输出中?
  • 现在我解释了所有我会得到回应吗?
  • 也许...花了一些时间发现发生了什么变化。

标签: mysql join


【解决方案1】:

我觉得应该是这样的。

select A_id, Cost1,  A1_id, cost2, Fname, Lname, Towns
from Table_A
left join Table_B on table_A.A1_id = Table_b.b_id
left join Table_C on Table_A.A_id  = Table_C.C_id

【讨论】:

  • +1 购买啤酒建议,也许他们可以将其添加到赏金系统中?
  • 哈哈,是的,就像 wordpress 插件“给我买啤酒”
【解决方案2】:

对我来说,这看起来像是两个不同查询的 UNION。我将假设 ID 列从不包含负值。

SELECT A.A_id, A.Cost1, A.A1_id, A.Cost2, B.Fname, B.Lname, C.Town
    FROM Table_A AS A
              INNER JOIN Table_B AS B ON A.A1_id = B.B_id
         LEFT OUTER JOIN Table_C AS C ON A.A_id  = C.C_id
    WHERE A.A1_id != 0
      AND C.C_id < 0
UNION
SELECT A.A_id, A.Cost1, A.A1_id, A.Cost2, B.Fname, B.Lname, C.Town
    FROM Table_A AS A
         LEFT OUTER JOIN Table_B AS B ON A.A1_id = B.B_id
              INNER JOIN Table_C AS C ON A.A_id  = C.C_id
    WHERE A.A1_id = 0
      AND B.B_id < 0;

我对这个表述并不完全有信心。 B.B_id

在单个 SELECT 中使用两个左外连接和适当的 OR 过滤器也很有可能获得正确的结果。

【讨论】:

    【解决方案3】:

    如果我理解正确的话,应该是:

    select fname, lname, towns
    from table_a, table_b table_c
    where table_a.a_id = table_c.c_id
      and table_a.a1_id = table_b.b_id
      and table_a.a1_id <> 0;
    

    【讨论】:

    • 您的查询将返回 0 行。要获得类似于示例的表格,您需要左连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2010-10-10
    相关资源
    最近更新 更多