mysql слева присоединяет несколько таблиц с отношением «один ко многим»

#mysql

#mysql

Вопрос:

Я создал простой тестовый пример:

 CREATE TABLE `t1` (
  `id` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)

CREATE TABLE `t2` (
  `id2` int NOT NULL AUTO_INCREMENT,
  `id1` int,
  PRIMARY KEY (`id2`)
)

CREATE TABLE `t3` (
  `id3` int NOT NULL AUTO_INCREMENT,
  `id1` int,
  PRIMARY KEY (`id3`)
)

insert into t1 (id) values (1);

insert into t2 (id1) values (1),(1);

insert into t3 (id1) values (1),(1),(1),(1);
  

Мне нужно выбрать все ОТДЕЛЬНЫЕ данные из t1 left join t2 и ОТДЕЛЬНЫЕ данные из t1 left join t3, возвращая в общей сложности 6 строк, 1 x (2 [из t2] 4 [из t3]) = 6, но из-за природы этого соединения я получаю 8 строк, 1 [из t1] x 2 [из t2] x 4 [из t3] = 8.

 select * from t1 left join t2 on (t1.id = t2.id1);
2 rows in set (0.00 sec)

select * from t1 left join t3 on (t1.id = t3.id1);
4 rows in set (0.00 sec)

select * from t1 left join t2 on (t1.id = t2.id1) left join t3 on (t1.id = t3.id1);
8 rows in set (0.00 sec)

select * from t1 left join t2 on (t1.id = t2.id1) union select * from t1 left join t3 on (t1.id = t3.id1);
4 rows in set (0.00 sec)
  

Какой запрос я должен использовать, чтобы получить только 6 строк, которые мне нужны, возможно ли это без подзапросов или они мне нужны (это будет сложнее в большом запросе, где мне это нужно)?
Мне это нужно для большого запроса, где я уже получаю данные из 8 таблиц, но мне нужно получить данные еще из 2, чтобы получить все необходимые данные всего за один запрос, но при соединении с 9-й таблицей возвращаемые данные дублируются (9-я таблица в этом простом тестовом примере будет t3, а 8-я будет t2).

Я надеюсь, что кто-нибудь может показать мне правильный путь, по которому нужно следовать.
Спасибо.

ОБНОВЛЕНИЕ РЕШЕНО: Я действительно не знаю, как выполнить этот тестовый пример в one select, но в моем БОЛЬШОМ запросе я решил это следующим образом: поскольку я использовал group_concat и group by, я сделал это, разделив значение в multipe group_concat(DISTINCT … ) и объединив их все следующим образом

 // instead of this
... group_concat(DISTINCT concat(val1, val2, val3)) ...
// I did this
concat(group_concat(DISTINCT val1,val2), group_concat(DISTINCT val1,val3)) ... 
  

таким образом, различие в небольших группах значений предотвращает все эти дубликаты.

Комментарии:

1. Как у вас может быть первичный ключ со значением по умолчанию?

2. @nick rulez : Я этого не заметил, я изменил столбец в t2, t3 с id на id2, id3, а mysql установил значение по умолчанию, обновил вопрос. …:P

Ответ №1:

Я не уверен, ищете ли вы это решение

 select * from t1 left join t2 on (t1.id = t2.id1);
union all
select * from t1 left join t3 on (t1.id = t3.id1);
  

Комментарии:

1. Я начал выполнять большой запрос с помощью подзапроса, это кажется единственной возможностью. Я оставлю вопрос открытым на несколько дней, чтобы посмотреть, научит ли нас кто-нибудь другому способу сделать это.

2. Это выдаст код ошибки: 1064 из-за неправильного использования UNION ALL.

Ответ №2:

Я думаю, что в запросе @nick rulez есть небольшая ошибка. Если это написано так, это действительно возвращает 6 строк:

 (SELECT * FROM t1 LEFT JOIN t2 ON (t1.id = t2.id1))
    UNION ALL
(SELECT * FROM t1 LEFT JOIN t3 ON (t1.id = t3.id1))