显示三个表的所有记录,即使第一个表中的记录不在第二个或第三个表中

时间:2019-03-15 11:35:16

标签: mysql join

我有三个表:

表1 tipo_producto

id_tipo_producto    nombre
1                   Teléfono
2                   Pendrive
3                   Cargador

表2特征

id_caracteristicas      nombre
1                       Memoria
2                       Camara

表3 caracteristicas_tipo_producto

id_tipo_producto        id_tipo_caracteristica
1                       1
1                       2
2                       1

我想要这样的结果查询:

id_tipo_producto    nombre        caracteristica
1                   Teléfono      Memoria|Camara
2                   Pendrive      Memoria
3                   Cargador      Null or Empty

我有此查询,但结果中没有“ Cargador”:

SELECT tp.id_tipo_producto, tp.nombre, GROUP_CONCAT(c.nombre ORDER BY c.nombre DESC SEPARATOR '|') AS caracteristicas
FROM caracteristica c 
INNER JOIN caracteristicas_tipo_producto ctp ON ctp.id_caracteristica = c.id_caracteristica
INNER JOIN tipo_producto tp ON ctp.id_tipo_producto = tp.id_tipo_producto
GROUP BY ctp.id_tipo_producto

2 个答案:

答案 0 :(得分:2)

使用左联接代替内部联接

SELECT tp.id_tipo_producto, tp.nombre, GROUP_CONCAT(c.nombre ORDER BY c.nombre DESC SEPARATOR '|') AS caracteristicas
FROM tipo_producto tp left JOIN caracteristicas_tipo_producto ctp 
   on ctp.id_tipo_producto = tp.id_tipo_producto 
left join caracteristica c ON ctp.id_caracteristica = c.id_caracteristica 
GROUP BY ctp.id_tipo_producto,tp.nombre

答案 1 :(得分:1)

    SELECT 
tp.id_tipo_producto,
tp.nombre,
GROUP_CONCAT(c.nombre ORDER BY c.nombre DESC SEPARATOR '|') AS caracteristicas
FROM caracteristica c 
INNER JOIN caracteristicas_tipo_producto ctp
ON c.caracteristicas = ctp.id_caracteristica
INNER JOIN tipo_producto tp 
ON tp.id_tipo_producto = ctp.id_tipo_producto
GROUP BY ctp.id_tipo_producto

令您惊讶的是,您的原著甚至顺利通过了,因为您在join子句中拼写了group_concat别名。 另外,在连接表时尝试遵循简单的规则> 尽管大多数新版本不会因此而崩溃,但始终将table_whose_columns_are_first_提及为第一个,然后将联接表作为第二个 (否则,您将很快成为混乱查询的接收端)

让我们知道查询是否有效