左连接,但左表不显示相同的数据

时间:2018-02-13 07:32:51

标签: mysql

实施例

+------------+
| Fruits     |
+------------+
| Apple      |
| Banana     |
|            |
+------------+

+------------+
| Color      |
+------------+
| Red        |
| Green      |
| Yellow     |
+------------+

然后我选择加入子查询,得到如下结果:

+-----------------------+
|       Fruits_Color    |
+-----------------------+
| Apple      | Red      |
| Apple      | Green    |
| Banana     | Yellow   |
+------------+----------+

但是我期待这样的结果:

+-----------------------+
| Table Fruits_Color    |
+-----------------------+
| Apple      | Red      |
|            | Green    |
| Banana     | Yellow   |
+------------+----------+

我的查询:

SELECT fruits_name, color_name
FROM fruits f
LEFT JOIN (SELECT * FROM color) c ON c.id = f.color_id;

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

JOIN不按您想要的方式工作。如果存在匹配,则查询将返回每个匹配元组的每一列,即使其值为"重复" (与前一行的值相同)。无论如何,由于SQL不关心显示结果,因此无关紧要,它关注的是检索数据。

如果您不想显示"重复"值,您可以在您的应用程序中自由处理;在你的情况下,它只是MySQL客户端不做任何特殊处理,因此它显示每列的每个值。

答案 1 :(得分:1)

而不是留下空白,正常'在mysql中处理这个问题的方法是为每个水果/颜色组合返回一行,其中GROUP BY和GROUP_CONCAT()用于颜色。 e.g。

select f.name, group_concat(c.colour) 
from fruits f join fruit_colours fc on (f.id = fc.fid) 
join colours c on (c.id = fc.cid) 
group by f.name; 

+--------+------------------------+
| name   | group_concat(c.colour) |
+--------+------------------------+
| apple  | red,green              |
| banana | yellow                 |
+--------+------------------------+