#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))