Я работаю с таблицей, нуждаюсь в логической помощи.
Проверьте приведенный ниже URL-адрес для структуры таблицы и данных образца.
http://sqlfiddle.com/#!2/ece06/2
Таблица Схема:
CREATE TABLE test ( ID INTEGER, NAME VARCHAR (50), VALUE INTEGER );
Введенные данные:
INSERT INTO test VALUES (1, 'A', 4); INSERT INTO test VALUES (1, 'B', 5); INSERT INTO test VALUES (1, 'C', 8); INSERT INTO test VALUES (2, 'D', 9); INSERT INTO test VALUES (2, 'E', 9); INSERT INTO test VALUES (3, 'F', 9); INSERT INTO test VALUES (3, 'G', 9); INSERT INTO test VALUES (3, 'H', 9); INSERT INTO test VALUES (3, 'I', 9);
Запрос:
SELECT ID, GROUP_CONCAT(NAME) AS CODE FROM test GROUP BY ID;
Вывод:
ID CODE 1 A,B,C 2 D,E 3 F,G,H,I
Ожидаемый выход:
ID CODE CODE CODE CODE 1 ABC NULL 2 DE NULL NULL 3 FGHI
Поскольку вы можете видеть, что результат запроса имеет concat с запятой. И в настоящее время мы делаем строку concat с помощью PHP, который разбивается при отображении!
Есть ли другой способ разделить RESULT и показать каждое значение в столбце и том же ROW? В том же результате?
Примечание. КОД может различаться для каждого ROW.
Если вы знаете количество записей GROUP_CONCAT (я имею в виду, что три поля объединяются в случае ID = 1 и 2 поля объединяются в случае 2 и т. Д.), Тогда есть грязный способ.
SELECT ID, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NAME), ',', 1), ',', -1) AS CODE1, If( length(GROUP_CONCAT(NAME)) - length(replace(GROUP_CONCAT(NAME), ',', ''))>1, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NAME), ',', 2), ',', -1) ,NULL) as CODE2, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NAME), ',', 3), ',', -1) AS CODE3 FROM test GROUP BY ID;
Вывод:
ID CODE1 CODE2 CODE3 1 ABC 2 D (null) E 3 FGH
В приведенном выше запросе предполагается, что вы являетесь GROUP_CONCAT-3 полями. Если вы динамически генерируете запрос, вы можете попробовать. SQLFIDDLE
EDIT: Примечание. КОД может отличаться для каждого ROW. (Игнорируя это)
С помощью моей коллеги Мы пришли к точке, чтобы решить этот сенарио. Надеюсь, кому-то это понадобится. Радует, если кто-то сделает это намного проще.
BEGIN SET @v=0; SET @v1=0; SELECT tmp.cnt INTO @v FROM (SELECT Id, count(ID) AS cnt, GROUP_CONCAT(name) FROM test GROUP BY id) tmp ORDER BY tmp.cnt DESC LIMIT 1; SET @str=' '; WHILE(@v>@v1) DO SET @v1=@v1+1; IF(@str='') THEN SET @str=CONCAT(@str,'ID, REPLACE(SUBSTRING(SUBSTRING_INDEX(GROUP_CONCAT(NAME), '','',', @v1,'),LENGTH(SUBSTRING_INDEX(GROUP_CONCAT(NAME),'','',', @v1,'-1)) + 1),'','','''') AS Code' ,@v1); ELSE SET @str= CONCAT(@str,',REPLACE(SUBSTRING(SUBSTRING_INDEX(GROUP_CONCAT(NAME),'','',', @v1,'),LENGTH(SUBSTRING_INDEX(GROUP_CONCAT(NAME),'','',' , @v1,' -1)) + 1),'','','''') AS Code',@v1); END IF; END WHILE; SET @str=CONCAT('SELECT ' , @str, ' FROM test GROUP BY ID'); PREPARE MYSQLQUERY FROM @str; EXECUTE MYSQLQUERY; DEALLOCATE PREPARE MYSQLQUERY; END
Единственный способ разделить это на столбцы означает, что вы знаете значения, которые хотите разбить заранее (например: один столбец для кодов, соответствующих A, D, F
другой для B, E, G
и т. Д.). Кажется, это не так.
Пуленепробиваемый подход состоял бы в том, чтобы не группировать и обрабатывать результаты в PHP.
Другой возможный способ (а не тот, который я бы рекомендовал) состоял бы в том, чтобы изменить сапаратор от запятой к чему-то еще. НАПРИМЕР:
SELECT ID, GROUP_CONCAT(NAME SEPARATOR ';') AS CODE FROM test GROUP BY ID