【问题标题】:Select from multiple tables without using join and union从多个表中选择而不使用连接和联合
【发布时间】:2016-11-02 21:22:12
【问题描述】:

我有以下 SQL 查询:

SELECT t1.id as id,
       t1.username as username,
       CONCAT_WS(' ', t2.ad,t2.soyad) as fullname,
       t2.title as title,
       t3.pass as password,
       t3.phone_login as hat,
       t2.time as date
FROM kullanici t1, kullanici_tanim t2, dial_users t3
WHERE t1.id = t2.usr_id AND t1.agent_id = t3.user_id
GROUP  BY  t1.id
ORDER BY t1.id ASC

此查询工作正常。我想知道我应该使用联接吗?正确的方法是什么?

【问题讨论】:

  • 使用JOINs;从技术上讲,您已经符合 WHERE 子句中的条件,但是您这样做的方式过时且难以阅读。
  • 如果工作正常,问题出在哪里......只是一个提示......促进使用显式JOIN sintaxis,Aaron Bertrand 写了一篇很好的文章Bad habits to kick : using old-style JOINs 关于它。
  • 即使两者都会给出相同的结果,因为您现在正在使用带有 where 条件的 Cross Join,而在 Join 条件中,您将按所需列进行过滤
  • 现代 JOIN 语法将链接标准与过滤标准分开。这使得忘记链接标准并最终得到一个讨厌的笛卡尔积连接变得更加困难。
  • 逗号表示(“隐式”)交叉连接,其优先级低于(“显式”)关键字连接。

标签: mysql sql join union


【解决方案1】:

对于ANSI-92-compliant code,使用连接。例如:

SELECT   t1.id as id,
             t1.username as username,
             CONCAT_WS(' ', t2.ad,t2.soyad) as fullname,
             t2.title as title,
             t3.pass as password,
             t3.phone_login as hat,
             t2.time as date
FROM kullanici t1 
     INNER JOIN kullanici_tanim t2 
     ON t1.id = t2.usr_id 
     INNER JOIN dial_users t3
     ON t1.agent_id = t3.user_id
GROUP  BY  t1.id
ORDER BY t1.id ASC

【讨论】:

  • 当我删除“GROUP BY t1.id”时,我得到每行两次。如果没有 group by,如何为每个 id 获取一个?
  • 为什么不想使用 GROUP BY?
  • 我想知道如果没有 group by 是否可以每行只得到一个结果?
  • 试试SELECT DISTINCT ...
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2014-09-23
  • 2013-06-30
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多