2016-12-02 3 views
1

У меня есть SQL таблица объявлениеПолучить различные значения Concat из MySQL таблицы

id  name  cat 
11  abc  ab 
12  acb  ab, bc 
13  abb  bcd 
14  abcd  ad 
15  acbd  de 
16  abbd  ad 

С помощью DISTINCT функции я получаю выход как этот

Запрос:

SELECT DISTINCT cat FROM advert; 

Выход:

ab 
ab, bc 
bcd 
ad 
de 

Какие изменения мне нужно сделать в моем запросе для вывода как этот

ab 
bc 
bcd 
ad 
de 
+0

Я думаю, что лучшим решением было бы назначить одну категорию в строке. Я предполагаю, что ваш 'cat' является varchar – mabe02

+5

Я бы сказал, что неправильная структура таблицы. Никогда не помещайте несколько значений в одно поле. – Seb

+0

Какое максимальное количество значений может быть в одном столбце? –

ответ

1
select distinct trim(substring_index(substring_index(cat,',',n),',',-1)) as cat 

from t join (select 1 as n union all select 2 union all select 3) r 
     on cat like concat('%',repeat(',%',n-1)) 
+0

Спасибо .... этот работает для меня ... – Ashish

+0

вы можете помочь мне в другом вопросе также (http://stackoverflow.com/questions/40991678/compare-value-with-comma-seperated-string-sql-php) – Ashish

+0

сделано сэр ... спасибо ... – Ashish

0

Я думаю, что вы должны изменить структуру таблицы и сделать это так.

tblName

id | name 
11  abc   
12  acb  
13  abb  
14  abcd  
15  acbd  
16  abbd 

tblCat

id   | name_id | cat 
some ids*  11  ab 
       12  ab 
       12  bc 
       13  bcd 
       14  ad 
       15  de 
       16  ad 

Таким образом, вы можете легко запрашивать и управлять данными в таблицах.

+0

Я создал таблицу, как вы порекомендовали .... Можете ли вы рассказать мне о том, чтобы присоединиться к этим двум .... Спасибо ... – Ashish

+0

выберите отдельную кошку из tblCat –

+1

, чтобы этот запрос показал желаемый результат. но если вы хотите присоединиться к этим двум ** выберите отдельный b.cat из tblCat как b inner join tblName как ** –

0

Вы должны исправить вашу структуру данных, чтобы не сохранять списки с разделителями-запятыми в столбцах. Это неверный способ хранения данных в реляционной базе данных. , , как вы можете видеть из-за проблем для ответа на этот простой вопрос. То, что вам нужно, - это соединительная таблица.

Иногда мы застреваем с другими плохими проектами народов. Вы говорите, что есть только два или значения, то вы можете сделать:

select cat 
from ((select substring_index(cat, ', ', 1) as cat 
     from advert 
    ) union all 
     (select substring_index(substring_index(cat, ', ', 2), ', ', -1) as cat 
     from advert 
     where cat like '%, %' 
    ) union all 
     (select substring_index(substring_index(cat, ', ', 3), ', ', -1) as cat 
     from advert 
     where cat like '%, %, %' 
    ) 
    ) c 
group by cat; 
0

... Во-первых я хотел бы создать заявление, которое превратило бы все строки в один большой массивный разделителями запятыми список.

DECLARE @tmp VarChar(max) 
SET @tmp = '' 
SELECT @tmp = @tmp + ColumnA + ',' FROM TableA 

Затем используйте таблицу значной UDF разделить описываемое этим SO статьей, чтобы превратить эту массивную строку обратно в таблицу с отдельной статьей, чтобы убедиться, что оно уникально.

https://stackoverflow.com/a/2837662/261997

SELECT DISTINCT * FROM dbo.Split(',', @tmp) 

Полный пример кода:

if object_id('dbo.Split') is not null 
    drop function dbo.Split 
go 
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512)) 
RETURNS table 
AS 
RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT pn, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s 
    FROM Pieces 
) 
go 
declare @t table (colA varchar(max)) 
insert @t select '111, 223' 
union all select '333' 
union all select '444' 
union all select '777,999'; 

select ltrim(rtrim(s.s)) as colC 
from @t t 
cross apply 
     dbo.split(',', t.colA) s 
Смежные вопросы