2013-06-03 55 views
0

我有一個表格,其中有category列。隨着客戶的選擇,我想在每一行上選擇可能的類別的值 - 也就是該子集中所有類別的唯一值。如何從查詢中選擇不同的值並連接成一列

我的表看起來像這樣:

| id | name   | category | 
------------------------------------ 
| 1 | Test Client | Retail  | 
| 2 | Test Client 2 | Corporate | 
| 3 | Test Client 3 | Retail  | 
| 4 | Test Client 4 | Retail  | 
| 5 | Test Client 5 | Leisure  | 

我想GROUP_CONCAT會做的伎倆:

SELECT `client`.*, GROUP_CONCAT(DISTINCT client.category) AS possible_categories 
FROM (`client`) 
WHERE `name` LIKE '%query%' 
GROUP BY `client`.`id` 

...但它只是給了我這一行的類別,而不是別人。

我可以在代碼中做到這一點,但它是一個O(n)操作,我寧願節省處理時間。以下是我能做到這一點的代碼,用於說明目的:

return array_unique(array_map(function($client) 
{ 
    return $client->category; 
}, $clients)); 

理想的情況是看到像這樣的表:

| id | name   | category | possible_categories  | 
--------------------------------------------------------------- 
| 1 | Test Client | Retail  | Retail,Corporate,Leisure | 
| 2 | Test Client 2 | Corporate | Retail,Corporate,Leisure | 
| 3 | Test Client 3 | Retail  | Retail,Corporate,Leisure | 
| 4 | Test Client 4 | Retail  | Retail,Corporate,Leisure | 
| 5 | Test Client 5 | Leisure  | Retail,Corporate,Leisure | 
+0

如果您添加表格定義和樣本數據到您的問題可能會有所幫助。 –

+0

Aziz,完成,謝謝 –

+0

在該表中,'id'看起來像主鍵?正確,如果是的話,GROUP BY怎麼能做到?它將永遠是一個'每個行' – barryhunter

回答

0

假設你的意思是可能的類別匹配的名稱: -

SELECT `client`.*, Sub1.possible_categories 
FROM (`client`) 
CROSS JOIN (SELECT GROUP_CONCAT(DISTINCT client.category) AS possible_categories FROM (`client`) WHERE `name` LIKE '%query%') Sub1 
WHERE `name` LIKE '%query%' 

注意LIKE中的前導通配符可能會使其運行緩慢。

0

如果「可能的類別」你的意思是所有類別,那麼你需要單獨計算並添加他們:

SELECT `client`.*, cc.possible_categories 
FROM `client` cross join 
    (select GROUP_CONCAT(DISTINCT client.category) AS possible_categories 
     from `client` 
     where `name` LIKE '%query%' 
    ) cc 
WHERE `name` LIKE '%query%' 
0

我認爲這會爲你工作:

SELECT id, name, category, (SELECT GROUP_CONCAT(distinct category) FROM Client) AS possible_categories 
FROM client 

查看demo on SQLFiddle

相關問題