2017-06-22 66 views
2

我的查询看起来像这样:GROUP_CONCAT创建一个下拉

SELECT p.product_id, 
     Group_concat(DISTINCT Concat(optlan.option_label, ',', ovl.value) 
     SEPARATOR ';' 
     )                  AS 
     options_01, 
     Concat(Group_concat(DISTINCT optlan.option_label), ';', 
     Group_concat(DISTINCT ovl.value))          AS 
     options_02, 
     Concat_ws(';', optlan.option_label, Group_concat(DISTINCT ovl.value)) AS 
     options_03 
FROM products p 
     JOIN category c 
     ON p.category_id = c.category_id 
     LEFT JOIN options_categories opcat 
       ON opcat.category_id = c.category_id 
     LEFT JOIN options opt 
       ON opt.option_id = opcat.option_id 
     LEFT JOIN options_lang optlan 
       ON optlan.option_id = opt.option_id 
       AND optlan.lang_id = 'NL' 
     LEFT JOIN option_values ov 
       ON ov.option_id = opt.option_id 
     LEFT JOIN option_values_lang ovl 
       ON ovl.value_id = ov.value_id 
       AND ovl.lang_id = 'NL' 
WHERE p.product_id = '25' 
GROUP BY p.product_id; 

options_01结果:

option a,40;option a,50;option b,60;option b,70

options_2结果:

option a,option b;40,50,60,70

和options_03:

option b;60,70

我想创建这样的:

option a;40,50|option b;60,70

或者我需要用PHP到查询创建它?希望可以有人帮帮我。

+2

犯罪嫌疑人,更好地使在PHP-side.Yes,思维处理输出数据,当然有可能组要如何使用MySQL(我不Ť知道你的桌子的结构),但它看起来可怕并且难以理解。 – voodoo417

+0

@ voodoo417:其含义是我将标签与其值相结合。因此,例如,标签(option_a,option_b等)和表值(50,60,70,80 ...)中的前两个来自option_a,所以结果必须是:(option_a; 50 ,60 | option_b; 70,80 | etcetera .......) –

回答

0

我不知道你的数据库/表的结构,但我想你可以修改您的查询像这样(与你的案件的所有修改):

 SELECT 
      GROUP_CONCAT(options_try SEPARATOR '|') as your_field 
     FROM (
      SELECT 
       CONCAT(optlan.option_label, ';', GROUP_CONCAT(ovl.value SEPARATOR ",")) AS options_try 
      FROM 
       products p 
      JOIN category c 
       ON p.category_id = c.category_id 
      LEFT JOIN options_categories opcat 
       ON opcat.category_id = c.category_id 
      LEFT JOIN options opt 
       ON opt.option_id = opcat.option_id 
      LEFT JOIN options_lang optlan 
       ON optlan.option_id = opt.option_id AND optlan.lang_id = 'NL' 
      LEFT JOIN option_values ov 
       ON ov.option_id = opt.option_id 
      LEFT JOIN option_values_lang ovl 
       ON ovl.value_id = ov.value_id AND ovl.lang_id = 'NL' 
      WHERE 
       p.product_id = '25' 
      GROUP 
       BY optlan.option_label; 
     ) x1 

请注意,在组查询结束。如果您不按“主”字段对结果进行分组,则不能使用group_concat。

+0

感谢您的帮助,但您的查询出错。我在我的剧本中分组。 –

+0

是的,这是正常的,因为我写我不知道表的结构,所以我不能测试它是否工作。我的回答只会解释你如何组织过滤器,但最终的模组必须由你自己制作;) – Ryosaku

+0

我理解你的意思,但是我会让我的“问题”更加清晰。我尝试在下面解释而不是这个评论 –

0

也许我确实让我的问题复杂化了,因为我可以更轻松地做到这一点。

假设我不得不表:

表1:选择=> option_id和option_label 表2:值=> value_id,option_id和值

CREATE TABLE `options` (
`option_id` int(5) UNSIGNED NOT NULL, 
`option_label` varchar(100) NOT NULL DEFAULT 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; 

CREATE TABLE `values` (
`value_id` int(5) UNSIGNED NOT NULL, 
`option_id` int(5) UNSIGNED NOT NULL , 
`value` varchar(100) NOT NULL DEFAULT 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

表选择: INSERT INTO options( (1,'option'), (2,'option b');

表值: INSERT INTO option_valuesvalue_idoption_idvalue)VALUES (1,1, 'VAL 1A'), (2,1, 'VAL 2A'), (3,1,' (2,2',val1b'),

现在查询看起来应该像这样:

SELECT 
GROUP_CONCAT ........... AS all_options 
FROM options o 
JOIN values v 
ON o.option_id = v.option_id 
GROUP BY o.option_id 

结果应该是这样的:

all_options 选项; VAL 1A,VAL 2A,VAL 3A |选项B; VAL 1B, VAL 2B

希望这是有道理.....