3

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

我有3张桌子..

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

衬衫:

席位 | 名称
------------
01 | 样品1
02 | 样品2

颜色

席位 | 颜色 | color_id
------------
01 | 红色 | 900
02 | 绿色 | 090

价格:

席位 | 价格
------------
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'

我想要实现的是:

席位 | 姓名 | 颜色 | 价格
----------------------
02 | 样品2 | 绿色 | 100

我得到的是:

席位 | 姓名 | 颜色 | 价格
----------------------
空 | 空 | 空 | 空值

我知道我的查询一定有问题。所以谁能告诉我什么是正确的查询?

4

6 回答 6

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'

Prices. GENDB_ID不是有效字段或不是您必须使用的字段(我想)。

于 2013-08-20T06:31:31.017 回答
1

试试下面的。这部分

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

看起来不正确。请尝试:

on `Shirts`.`sid` = `Prices`.`sid`
于 2013-08-20T06:32:15.363 回答
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'
于 2013-08-20T06:32:31.650 回答
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'
于 2013-08-20T06:37:47.273 回答
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 JOIN和之间的不同之处LEFT JOIN在于 anINNER JOIN将排除两个表之间不会导致匹配的任何连接组合,而LEFT JOIN即使没有匹配也会强制一行。

一个例子:

衬衫

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

颜色

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

内部联接

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

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

左连接

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这会导致行中所有列的值都只有空值。

以前的这篇文章也可能有所帮助。

希望这可以帮助!

于 2013-08-20T06:37:34.820 回答
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过滤器中,而不是在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

更正:

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   //Correct.
//WHERE `Shirts`.`sid`='02'
于 2013-08-20T06:40:31.990 回答