mysql concat_ws без дубликатов - PullRequest
       14

mysql concat_ws без дубликатов

3 голосов
/ 28 февраля 2012

Я пытаюсь объединить несколько полей в одно, но сохранить только уникальные значения в результирующей строке.

Пример:

title_orig | title_fr   | title_de                | title_it
---------------------------------------------------------------------
KANDAHAR   | KANDAHAR   | REISE NACH KANDAHAR     | VIAGGO A KANDAHAR
SCREAM 2   | SCREAM 2   | SCREAM 2                | SCREAM 2

При CONCAT_WS(', ', title_orig, title_fr, title_de, title_it) AS titles я бы получил

titles
------------------------------------------------------------
KANDAHAR, KANDAHAR, REISE NACH KANDAHAR, VIAGGO A KANDAHAR
SCREAM 2, SCREAM 2, SCREAM 2, SCREAM 2

Но я бы хотел получить

titles
------------------------------------------------
KANDAHAR, REISE NACH KANDAHAR, VIAGGO A KANDAHAR
SCREAM 2

В PostgreSQL я использовал хранимую процедуру plperl (%seen=(); return join(", ", grep {$_ && ! $seen{$_}++} @_).

Как мне избавитьсядубликатов в MySQL?

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Требуется немного работы:

SELECT 
  CONCAT(
    title_orig,
    IF(title_fr=title_orig,'',CONCAT(', ',title_fr)),
    IF(title_de=title_orig OR title_de=title_fr,'',CONCAT(', ',title_de)),
    IF(title_it=title_orig OR title_it=title_fr OR title_it=title_de,'',CONCAT(', ',title_it))
  ) AS title_concat
FROM
  ...
0 голосов
/ 08 апреля 2016

Существует альтернативное решение, использующее group_concat(), но оно также довольно громоздко:

SELECT id, group_concat(
  DISTINCT titles
  ORDER BY titles
  SEPARATOR ', ')
FROM (
  SELECT id, title_orig AS titles FROM test
  UNION ALL SELECT id, title_fr FROM test 
  UNION ALL SELECT id, title_de FROM test 
  UNION ALL SELECT id, title_it FROM test
) AS tmp
GROUP BY id;
...