【问题标题】:mysql join under condition条件下的mysql加入
【发布时间】:2015-03-08 06:57:33
【问题描述】:

我有这张表 id_name:

+----+------+
| id | name |
+----+------+
| 1  |  one |
| 2  |  two |
| 3  | three|

...等,以及另一个表ID

+----+-----+-----+-----+----
| id | aid | bid | cid | ...
+----+-----+-----+-----+----
| 1  |  1  |  2  |  3  | ...
| 2  |  2  | null| null| ...
| 3  |  2  |  3  | null| ...

我想选择这样的东西:

+----+-----+-----+-----+-----+-----+-----+----
| id | aid |aname| bid |bname| cid |cname| ...
+----+-----+-----+-----+-----+-----+-----+----
| 1  |  1  | one |  2  | two |  3  |three| ...
| 2  |  2  | two | null| null| null| null| ...
| 3  |  2  | two |  3  |three| null| null| ...

基本上,如果id不为null,则取name到对应的列,否则保持name为null。

在我的项目中,我有 7 列 (a-g)。

我尝试了 7 级连接,基本上是这样的:

SELECT id,a.id AS aid,a.name AS aname,b.id AS bid,b.name AS bname, ...
  FROM ids AS t
JOIN id_name AS a ON a.id=t.aid
JOIN id_name AS b ON b.id=t.bid
... 

等等。但后来我注意到,如果 t.b 为空,那么 b.id=null 始终为假,所以我不会选择任何行。 我该怎么做 IF b.id IS NULL THEN JOIN id_name AS b ON b.id=t.bid ELSE "keep bname null"?

我知道我可以创建一个临时表并进行 7 次更新。但是有没有办法使用单个 SELECT 来完成此操作?

谢谢!

【问题讨论】:

    标签: mysql join conditional-statements


    【解决方案1】:

    您必须使用外连接。例如

    SELECT id,a.id AS aid,a.name AS aname,b.id AS bid,b.name AS bname, ...
      FROM ids AS t 
    LEFT OUTER JOIN id_name AS a ON a.id=t.aid
    LEFT OUTER JOIN id_name AS b ON b.id=t.bid
    ...
    

    更多信息http://dev.mysql.com/doc/refman/5.0/en/join.html

    【讨论】:

    • 我实际上使用交叉连接来完成这个。还是谢谢你!
    【解决方案2】:

    您也可以使用cross join 获得结果,而无需多次加入同一个表

    SQL Fiddle

    select ids.id, 
           aid, 
           max(case when aid = id_name.id then id_name.name end)  as aname, 
           bid, 
           max(case when bid = id_name.id then id_name.name end ) as bname
    from ids
    cross join id_name 
    group by ids.id, aid, bid
    

    【讨论】:

    • 谢谢!这看起来更简单:)
    • 还有一个问题:实际上我有两个 id_name 表,一个用于 a、b 列,一个用于 c 列。我是否做两个交叉连接,如交叉连接 id_name 交叉连接 id_name2?
    【解决方案3】:
    select
      i.id,
      a.id as aid,
      a.name as aname,
      b.id as bid,
      b.name as bname,
      c.id as cid,
      c.name as cname
    from ids i
      left join id_name a
        on a.id = i.aid
      left join id_name b
        on b.id = i.bid
      left join id_name c
        on c.id = i.cid
    

    SQL 小提琴:http://www.sqlfiddle.com/#!2/3ea82/1

    【讨论】:

    • 我实际上最终得到了一个交叉连接。还是谢谢你!
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2012-07-26
    • 2013-03-24
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多