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 |
4

3 に答える 3

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%'
于 2013-06-03T13:27:10.960 に答える
0

私はこれがあなたのために働くと思います:

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

SQLFiddleのデモを参照してください。

于 2013-06-03T13:28:32.550 に答える