【问题标题】:MySQL - select 3 tables with correct left join syntaxMySQL - 选择 3 个具有正确左连接语法的表
【发布时间】:2012-07-29 10:22:03
【问题描述】:

希望您能帮助我了解正确的 SQL 查询语法(使用 MySQL 5.5.25)。

我有 3 张桌子:

  • 数据
  • data_tmp
  • 用户

data 表为空 - 有自己的结构但没有行

数据

id | name | who
----------------

data_tmp

id | cars | who
---------------
1  | lambo| 2

用户

who | name |
------------
 2  | john

我的查询是:

SELECT DISTINCT 
    users.name, 
    (SELECT count(id) FROM data WHERE who = 1) as number, 
    data_tmp.cars 
FROM 
    users, data, data_tmp 
WHERE 
    users.who = 2 
    AND data_tmp.who = 2 
    AND data.who = 2

这当然会返回一个空结果(没有适合所有参数的行,因为data 是空的)。

我想要实现的是:

users.name | number | data_tmp.cars |
-------------------------------------
 john      |    0   | lambo         |

我确信我必须 - 以某种方式 - 使用 LEFT JOIN 但找不到正确的语法。希望你能帮助我。

卡雷格

【问题讨论】:

  • 什么数据库系统,哪个版本? SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...功能的详细信息通常是特定于供应商的 - 所以我们真的需要知道您使用的是什么数据库系统....
  • @Kalreg 在下面查看我的答案。

标签: mysql syntax left-join


【解决方案1】:

试一试(不使用子查询

SELECT  a.name, b.cars, count(c.id) as  number
FROM    users a 
            INNER JOIN data_tmp b
                on a.who = b.who
            LEFT JOIN data c
                on a.who = c.who AND
                   a.name = c.name
WHERE    a.who = 2 
GROUP BY a.name, b.cars

这适用于不同的服务器:

MSSQL SERVER @ SQLFIDDLE
MYSQL @ SQLFIDDLE

【讨论】:

  • 这不能正常工作,即因为c表中没有'name'列。
  • 你测试了吗?这就是我使用LEFT JOIN 的原因。 INNER JOINLEFT JOIN 是两个不同的东西。点击下面的 sql fiddle 链接:)
【解决方案2】:

您的假设是正确的:您必须以这种方式使用左连接:

SELECT DISTINCT users.name, (SELECT count(id) FROM data WHERE who = 1) as number, data_tmp.cars 
FROM users
JOIN data_tmp USING (who)
LEFT JOIN data USING(who)
WHERE users.who = 2

【讨论】:

  • 感谢您的回答!不幸的是,这会返回不正确的语法:(你能在你的数据库上检查一下吗?
  • 你用的是什么数据库?
  • 更好,但返回空结果
  • 不,它有效,见这里:sqlfiddle.com/#!2/9e16a/7/0 但是我已经更新了我的答案..
  • john idea 对我来说很好用(见下文)。我在“使用”公式时遇到了一些麻烦,我不知道为什么。无论如何感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2016-08-31
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多