【问题标题】:SELECT same data from EITHER one of two tables从两个表之一中选择相同的数据
【发布时间】:2019-04-20 22:16:38
【问题描述】:

我必须做一些计时。有些员工是第一队的一员,有些是第二队的一员。我需要显示一个简单的表格,其中包含登录者和登录时间以及其他一些基本信息。

如果两个表 team1 和 team2 具有相同的列(first_namelast_namedate),但绝对可以保证这些表中只有一个表每行会返回数据我如何避免使用一堆别名(first_name AS team1_first_name) 并且总是让 SQL 返回first_name

一个示例查询:

SELECT *
FROM associates AS ac
LEFT JOIN team1 AS t1 ON (t1.id = ac.team1) 
LEFT JOIN team2 AS t2 ON (t2.id = ac.team2) 
ORDER BY ac.date DESC LIMIT 100;

【问题讨论】:

  • 我认为您可以将 union 与 distinct 一起使用。当你让左加入team2时,你需要改变你的“on”(t2.id = ac.team2)。
  • associates 中,两个表都只有一个外键team1,还是打错了?
  • @evilGenius 我会调查的。
  • @forpas 我想我会错过一些小问题,错字。
  • @GordonLinoff 已经收到了有效的答案,不过还是谢谢你。基本上SELECT 来自两个不同表的完全相同的数据/列。

标签: mysql sql join mariadb


【解决方案1】:

由于t1.first_namet2.first_name 之一为空,而另一个不为空,
您可以像这样在 select 语句中使用coalesce()

select
  coalesce(t1.first_name, t2.first_name) first_name,
  coalesce(t1.last_name, t2.last_name) last_name,
  .............................................

【讨论】:

    【解决方案2】:

    如果您不想输入所有列并且员工只在一个团队中,您可以unionjoin 之前的表格:

    SELECT a.*, t.*
    FROM associates a JOIN
         ((SELECT t1.* FROM team1 t1) UNION ALL
          (SELECT t2.* FROM team2 t2)
         ) t
         ON t.id IN (ac.team1, ac.team2)
    ORDER BY a.date DESC
    LIMIT 100;
    

    【讨论】:

    • @John 。 . .这与其他答案不同。特别是,这正是您的问题所要求的——“我如何避免使用一堆别名”。
    • 是的,不幸的是,不是每个表对都可以UNION ALL,因为我正在使用的表对包含不同数量的列;我不知道我最初应该做出的澄清。这两个答案都很好,并阐明了一个重要的背景,这就是我对你的答案投赞成票的原因。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2012-12-28
    • 1970-01-01
    • 2019-02-09
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多