mysql从字符串列表中获取不同的标记

时间:2012-09-26 08:51:06

标签: mysql sql

我在mysql中查询group concats个记录并提供具有冗余令牌的值。以下是查询的输出:

Problem Area->ACC-HO->ACC-HO->Credit Note (C/N)->Problem description ->Problem description 

但是我希望这个字符串的明显标记如下所示

Problem Area->ACC-HO->Credit Note (C/N)->Problem description 

有没有办法在sql SELECT查询中执行此操作?

修改 这是schema and query 以下是我的询问:

SELECT 
t2.transaction_id AS transaction_id, 
GROUP_CONCAT(
CONCAT(
 t1.display_text,
 '->',
   (CASE (NOT EXISTS (SELECT 1 FROM mst_node a WHERE a.parent_node_id = t1.node_id))
      WHEN 1 THEN t1.display_text ELSE 
      (SELECT b.display_text AS DISPLAY FROM mst_node b 
      WHERE parent_node_id = t2.node_id AND b.display_seq = t2.entered_value) 
     END)
     ) 
  ORDER BY t2.logtime_stamp SEPARATOR '->'
) AS display_text 
FROM

mst_node t1 
  JOIN trn_user_log t2 
    ON t1.app_id = t2.app_id AND t1.node_id = t2.node_id     
WHERE (t1.app_id = 105) 
  AND t1.parent_node_id IS NOT NULL 
  AND t1.save_as_default IS NULL 
GROUP BY transaction_id,
  mobile_no 
ORDER BY t2.transaction_id DESC,
  t2.logtime_stamp,
  t2.mobile_no 

3 个答案:

答案 0 :(得分:5)

在你GROUP CONCAT添加DISTINCT,这样它才会连接唯一值。

SELECT GROUP_CONCAT(DISTINCT colName),....
FROM   ...
WHERE  ...
GROUP BY ...

SQLFiddle Demo

答案 1 :(得分:0)

在您的分组子句中,您也可以通过此字符串列添加另一个group by

SELECT GROUP_CONCAT(myStringColumn),....
FROM   ...
WHERE  ...
GROUP BY myOtherColumn,myStringColumn

答案 2 :(得分:0)

我终于可以使用UNION两个选择查询然后执行GROUP_CONCAT(DISTINCT column ORDER BY another_column)来解决我的问题。

以下是我使用的查询:

SELECT 
transaction_id,
GROUP_CONCAT(DISTINCT display_text ORDER BY logtime_stamp SEPARATOR '->') AS display_text
FROM
 (SELECT 
  t2.transaction_id AS transaction_id,
  t2.logtime_stamp,
  t1.display_text AS display_text 
  FROM mst_node t1 
  JOIN trn_user_log t2 ON t1.app_id = t2.app_id 
   AND t1.node_id = t2.node_id 
   WHERE (t1.app_id = 105) 
   AND t1.parent_node_id IS NOT NULL 
   AND t1.save_as_default IS NULL 
  UNION
 SELECT t2.transaction_id AS transaction_id,t2.logtime_stamp,
  CASE(NOT EXISTS (SELECT 1 FROM mst_node a WHERE a.parent_node_id = t1.node_id)) 
  WHEN 1 THEN NULL 
  ELSE (SELECT b.display_text AS display_text FROM mst_node b WHERE parent_node_id = t2.node_id AND b.display_seq = t2.entered_value) 
  END AS display_text
FROM   mst_node t1 JOIN trn_user_log t2 
      ON t1.app_id = t2.app_id AND t1.node_id = t2.node_id    
  WHERE (t1.app_id = 105) 
  AND t1.parent_node_id IS NOT NULL 
  AND t1.save_as_default IS NULL 
  ORDER BY transaction_id DESC,logtime_stamp
  ) AS T 
  GROUP BY transaction_id 
  ORDER BY transaction_id DESC,logtime_stamp