正确的MySQL语法左连接

时间:2013-08-20 06:28:15

标签: mysql

我是 内部加入 左加入 的新手,希望有人可以帮助我。

我有3张桌子..

  1. 衬衫
  2. 颜色
  3. 价格
  4. 衬衫:

      

    SID |名称
      ------------
      01 |样品1   02 |样品2

    颜色

      

    sid |色| COLOR_ID
      ------------
      01 |红色| 900个
      02 |绿色| 090

    价格:

      

    sid |价格
      ------------
      01 | 100
      02 | 100

    我的查询是:

    SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
    INNER JOIN `Colors`
    on `Shirts`.`sid` = `Colors`.`sid`
    LEFT JOIN `Prices`
    on `Shirts`.`sid` = `Prices`.`sid`
    WHERE `Shirts`.`sid`='02'
    

    我想要达到的目标是:

      

    sid |名字|颜色|价格
      ----------------------
      02 | Sample2 |绿色| 100

    我得到的是:

      

    sid |名字|颜色|价格
      ----------------------
      null | null | null | null

    我知道我的查询肯定有问题。所以有人可以告诉我对此有什么正确的查询吗?

6 个答案:

答案 0 :(得分:1)

我认为你必须使用:

SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Shirts`.`sid`='02'

PricesGENDB_ID不是有效字段,也不是您必须使用的字段(我想)。

答案 1 :(得分:1)

尝试以下方法。这部分

`on `Shirts`.`sid` = `Prices`.`GENDB_ID

看起来不正确。请尝试改为:

on `Shirts`.`sid` = `Prices`.`sid`

答案 2 :(得分:1)

试试这个: -

SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid` AND  `Prices`.`price`= 100   //Change this part.
WHERE `Shirts`.`sid`='02'

答案 3 :(得分:1)

SELECT 
    `Shirts`.*, 
    `Colors`.`color`,
    `Prices`.`price` 
FROM 
    `Shirts` INNER JOIN `Colors` on `Shirts`.`sid` = `Colors`.`sid`
     JOIN `Prices` on `Shirts`.`sid` = `Prices`.`sid` 
WHERE `Shirts`.`sid`='02'

答案 4 :(得分:0)

这应该有效:

SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Shirts`.`sid`='02'

您获得全部空行的原因是您在联接中包含的GENDB_ID

INNER JOINLEFT JOIN之间的区别在于INNER JOIN将排除两个表之间的任何连接组合,这些组合不会导致匹配,LEFT JOIN将强制即使没有匹配也会排成一行。

一个例子:

<强>衬衫

sid  |   name 
------------ 
01  | Sample1 
02  | Sample2

<强>颜色

sid |  color | color_id
------------ 
01 |    red | 900
03 |  green | 090

INNER JOIN

SELECT * FROM Shirts INNER JOIN Colors ON Shirts.sid = Colors.sid

sid |   name  | color | color_id
---------------------------------
01  | Sample1 |  red  | 900

LEFT JOIN

SELECT * FROM Shirts LEFT JOIN Colors ON Shirts.sid = Colors.sid

sid |   name  | color | color_id
---------------------------------
01  | Sample1 |  red  | 900
02  | Sample2 |  null | null

因此,在您的示例中,您强制使用LEFT JOIN的行匹配不存在的条件GENDB_ID,这会导致行中的所有列只有空值。

This previous post也可以提供帮助。

希望这有帮助!

答案 5 :(得分:0)

因为你是内部加入和离开加入的新手,我会让你快速回顾。

首先,将您的查询更改为这样(您参与ON过滤器的字段出错了)

SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`     //Change this.
WHERE `Shirts`.`sid`='02'

除此之外,当您使用left join时,您放入where条件的列(左侧或右侧列中的列)确实很重要。

要获得正确和预期的结果,如果必须按RIGHT表(在您的Prices表中)中的列过滤查询,那么该条件放在ON过滤器中,而不是{{1过滤。

示例:

WHERE

修正:

SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`     
WHERE `Prices`.`price`= 100             //This can be wrong