2016-12-02 86 views
1

我有一個SQL表廣告檢索從MySQL表

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

使用我得到的輸出喜歡這個

查詢DISTINCT函數鮮明CONCAT值:

SELECT DISTINCT cat FROM advert; 

輸出:

ab 
ab, bc 
bcd 
ad 
de 

我需要做什麼變化在我的查詢這樣的輸出

ab 
bc 
bcd 
ad 
de 
+0

我想,最好的解決辦法是賦予每行一個類別。我認爲你的'貓'是一個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

選擇不同的貓,該查詢將顯示您想要的結果。但如果你想加入這兩個**從tblCat中選擇不同的b.cat作爲b內部連接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 

然後使用SO文章所描述的表值UDF分裂把這一龐大的字符串返回到表具有鮮明的條款,以確保它是獨一無二的。

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