Показывать все записи трех таблиц, даже если те, что в первой таблице, не находятся во второй или третьей

#mysql #join

#mysql #Присоединиться

Вопрос:

У меня есть три таблицы:

Table1 типо_продукто

 id_tipo_producto    nombre
1                   Teléfono
2                   Pendrive
3                   Cargador
  

Характеристики таблицы2

 id_caracteristicas      nombre
1                       Memoria
2                       Camara
  

таблица3характеристика_типо_продукто

 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
  

Ответ №1:

Используйте левое соединение вместо внутреннего соединения

 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
  

Ответ №2:

     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
  

Я удивлен, что ваш оригинал даже прошел без ошибок, потому что вы неправильно написали псевдоним group_concat в предложении join.
Кроме того, старайтесь следовать простому правилу при объединении таблиц>
Хотя большинство более новых версий не взорвутся из-за этого, всегда ставьте table_whose_columns_are_first_mented в качестве первого, а объединяющую таблицу второй
(Если вы этого не сделаете, достаточно скоро именно вы будете получать запутанные запросы)

Сообщите нам, сработал ли запрос