2014-01-07 5 views
1

У меня есть несколько таблиц, с которыми мне нужно объединить группу результатов. Всего 6 таблиц с индексом в каждом совпадении primary_key в исходной таблице.Проблемы с MySQL group_concat

Однако, когда я выполняю свой запрос, это приводит к появлению нескольких экземпляров каждого результата, возвращаемого для каждой таблицы. Если я выбираю только одну запись, вывод будет прекрасным. Кажется, что запрос выполняется несколько раз за столом, и все результаты объединяются вместе.

SELECT id, 
    GROUP_CONCAT(tb1.table1) AS tbl1, 
    GROUP_CONCAT(tb2.table2) AS tbl2, 
    GROUP_CONCAT(tb3.table3) AS tbl3, 
    GROUP_CONCAT(tb4.table4) AS tbl4, 
    GROUP_CONCAT(tb5.table5)AS tbl5 
    FROM table t 
    LEFT OUTER JOIN (
     SELECT id, field2 
     FROM table1 
     GROUP BY id 
    ) tb1 
    ON tb1.id = t.id 
    LEFT OUTER JOIN (
     SELECT id, field2 
     FROM table2 
     GROUP BY id 
    ) tb2 
    ON tb2.id = t.id 
    LEFT OUTER JOIN (
     SELECT id, field2 
     FROM table3 
     GROUP BY id 
    ) tb3 
    ON tb3.id = t.id 
    LEFT OUTER JOIN (
     SELECT id, field2 
     FROM table4 
     GROUP BY id 
    ) tb4 
    ON tb4.id = t.id 
    LEFT OUTER JOIN (
     SELECT id, field2 
     FROM table5 
     GROUP BY id 
    ) tb5 
    ON tb5.id = t.id 
    GROUP BY t.id 

Я ожидал/хочу, чтобы результаты были.

Primary Key | Field 1 | Field 2 | Field 3 | Field 4 | Field 5 
1   | 1, 2 | 2, 3 | 2, 4 | 1, 5 | NUll 

Но возвращаемые результаты, это только пример 1 строки, если не указав идентификатор записи, однако все строки выглядят следующим образом.

Primary Key | Field 1 | Field 2 | Field 3 | Field 4 | Field 5 
1   | 1,2  | 2,3, | 2,4  | 1,5, | NUll 
2   | 1,2,1, | 2,3,2, | 2,4,2, | 1,5,1, | 1 
2   | 1,2,1,2 | 2,3,2,3 | 2,4,2,4 | 1,5,1,5 | 1, 2 

Я в недоумении, где и почему запрос итерация себя несколько раз, а затем итерация над каждым столом.

Любая помощь была бы принята с благодарностью.

С уважением,

Edit: Я обновил свои первоначальные желаемые результаты и добавил несколько строк в таблице, как приносится назад.

включены также 4 схемы таблицы: CREATE TABLE IF NOT EXISTS table ( id INT (11) NOT NULL AUTO_INCREMENT, Name Varchar (255) По умолчанию NULL, ПЕРВИЧНЫЙ КЛЮЧ (id) );

CREATE TABLE IF NOT EXISTS `table2` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `table1id` int(11) NOT NULL, 
    `Name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX (`table1id`) 
); 

CREATE TABLE IF NOT EXISTS `table3` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `table1id` int(11) NOT NULL, 
    `Name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX (`table1id`) 
); 

CREATE TABLE IF NOT EXISTS `table4` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `table1id` int(11) NOT NULL, 
    `Name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX (`table1id`) 
); 

INSERT INTO `table`(`id`, `Name`) VALUES (1, 'Test'),(2, 'Second Test'),(3,'Third Test'),(4, 'Test Four'),(5,'Test Five'); 
INSERT INTO `table2` (`id`,`table1id`, `Name`) VALUES (1,1,'Test Value'), (2,2, 'Test Value 2'), (3,3, 'Test Value 3'); 
INSERT INTO `table3` (`id`,`table1id`, `Name`) VALUES (1,2,'Value'), (2,3, 'Value 2'), (3,4, 'Value 3'); 
INSERT INTO `table4` (`id`,`table1id`, `Name`) VALUES (1,1,'Test'), (2,2, 'Test 2'), (3,5, 'Test 3'); 
+0

Давайте представим, что есть только три таблицы, каждая с 2-мя колоннами. Рассмотрите возможность предоставления надлежащих DDL для этого (и/или sqlfiddle) ВМЕСТЕ С ЖЕСТКОЙ РЕЗУЛЬТАТОМ. – Strawberry

ответ

2

Использование DISTINCT для всех столбцов в GROUP_CONCAT()

Попробуйте это:

SELECT t.id, 
     GROUP_CONCAT(DISTINCT tb1.field2) AS tbl1, 
     GROUP_CONCAT(DISTINCT tb2.field2) AS tbl2, 
     GROUP_CONCAT(DISTINCT tb3.field2) AS tbl3, 
     GROUP_CONCAT(DISTINCT tb4.field2) AS tbl4, 
     GROUP_CONCAT(DISTINCT tb5.field2) AS tbl5 
FROM TABLE t 
LEFT OUTER JOIN table1 tb1 ON tb1.id = t.id 
LEFT OUTER JOIN table2 tb2 ON tb2.id = t.id 
LEFT OUTER JOIN table3 tb3 ON tb3.id = t.id 
LEFT OUTER JOIN table4 tb4 ON tb4.id = t.id 
LEFT OUTER JOIN table5 tb5 ON tb5.id = t.id 
GROUP BY t.id 
+0

Вы также можете, если нужно, поместить предложение ORDER BY в group_concat, например, так: «GROUP_CONCAT (DISTINCT вещь ORDER BY thing)», чтобы ваши списки, разделенные запятыми, были в порядке. –

+0

Пробовал это, но он возвращает только 1 строку не всех строк в базе данных. Удаление группы по t.id приводит к той же проблеме, что и раньше. Я попытаюсь разобрать SqlFiddle моей таблицы, чтобы попытаться привести пример. – dmurray

+0

Теперь работаем, удаляем группу в соединениях – dmurray

Смежные вопросы