2013-04-07 3 views
3

Я не понимаю, почему это GROUP_CONCAT не работает, насколько внешний запрос обеспокоен есть 3 строки, возвращаемые поэтому я хочу GROUP_CONCAT на это, но это не нравится ...Почему этот group_concat не работает?

http://sqlfiddle.com/#!2/24764/3

CREATE TABLE nested_category (
     category_id INT AUTO_INCREMENT PRIMARY KEY, 
     name VARCHAR(20) NOT NULL, 
     lft INT NOT NULL, 
     rgt INT NOT NULL 
); 

INSERT INTO nested_category VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4), 
(4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13), 
(9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18); 

SELECT GROUP_CONCAT(rs.category_id, ',') 
FROM 
    (
     SELECT node.category_id, node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
     FROM nested_category AS node, 
       nested_category AS parent, 
       nested_category AS sub_parent, 
       (
         SELECT node.category_id, node.name, (COUNT(parent.name) - 1) AS depth 
         FROM nested_category AS node, 
           nested_category AS parent 
         WHERE node.lft BETWEEN parent.lft AND parent.rgt 
          AND node.name = 'PORTABLE ELECTRONICS' 
         GROUP BY node.name 
         ORDER BY node.lft 
       )AS sub_tree 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
       AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
       AND sub_parent.name = sub_tree.name 
     GROUP BY node.name 
     HAVING depth = 1 
     ORDER BY node.lft 
    ) as rs 
GROUP BY rs.category_id 

ответ

7

две вещи:

Первое: Изменение GROUP_CONCAT(rs.category_id, ',') в GROUP_CONCAT(rs.category_id)

запятая является разделителем по умолчанию, from the docs у ожно видеть, что если вы хотите, чтобы изменить разделитель, который будет что-то вроде GROUP_CONCAT(rs.category_id SEPARATOR '|')

Второе: Удалить последнее: GROUP BY rs.category_id

Если вас group by каждый category_id, что значит каждый category_id в своем собственном наборе и такой group_concat будет иметь только одну категорию в строке.

http://sqlfiddle.com/#!2/24764/7

+0

ааа! Спасибо. – user391986

1

Попробуйте этот запрос

SELECT GROUP_CONCAT(rs.category_id) 
FROM 
    (
     SELECT node.category_id, node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
     FROM nested_category AS node, 
       nested_category AS parent, 
       nested_category AS sub_parent, 
       (
         SELECT node.category_id, node.name, (COUNT(parent.name) - 1) AS depth 
         FROM nested_category AS node, 
           nested_category AS parent 
         WHERE node.lft BETWEEN parent.lft AND parent.rgt 
          AND node.name = 'PORTABLE ELECTRONICS' 
         GROUP BY node.name 
         ORDER BY node.lft 
       )AS sub_tree 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
       AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
       AND sub_parent.name = sub_tree.name 
     GROUP BY node.name 
     HAVING depth = 1 
     ORDER BY node.lft 
    ) as rs 

Выходной

| GROUP_CONCAT(RS.CATEGORY_ID) | 
-------------------------------- 
|      7,9,10 | 
Смежные вопросы