2

これをどのように照会すればよいかわかりません。

表1

id    client_name   Group_id     
------------------------------
1     IBM               1
2     DELL              1   
3     DELL              2
4     MICROSOFT         3 
5     DELL              2
6     MICROSOFT         2
7     HP                3 
7     HP                1

表 2

id    group_name
------------------
1     Group1      
2     Group2     
3     Group3  

以下のクエリを使用します。

SELECT Client_name, GROUP_CONCAT(distinct(group_name)) merge_group , count(distinct(group_name)) as num_groups
FROM Table1 t1
JOIN Table2 t2
  ON t1.group_id = t2.id
GROUP BY t1.Client_name
ORDER BY t1.Id having num_groups > 1

これからの結果だろう

client_name      merge_group   
-------------------------
DELL               Group1,Group2
MICROSOFT          Group2,Group3
HP                 Group1,Group3

Group2 を選択した場合は、merge_group をフィルタリングする必要があります

結果はこれ

client_name      merge_group   
-------------------------
DELL               Group1,Group2
MICROSOFT          Group2,Group3

または、Group1 にクエリを実行すると、結果は次のようになります。

client_name      merge_group   
-------------------------
DELL               Group1,Group2
HP                 Group1,Group3
4

3 に答える 3

3

以下を試してください:

SELECT Client_name, GROUP_CONCAT(distinct(group_name)) merge_group , count(distinct(group_name)) as num_groups
FROM Table1 t1
JOIN Table2 t2  ON t1.group_id = t2.id
GROUP BY t1.Client_name
HAVING num_groups > 1
AND merge_group LIKE '%Group1%'
于 2013-07-08T07:54:55.437 に答える
0

FIND_IN_SET()このような場合のフィルタリングにもメソッドを使用できます。これはそれができる方法です:

SELECT
    client_name
    , GROUP_CONCAT(DISTINCT group_name) AS merge_group
    , COUNT(DISTINCT group_name) AS num_groups
FROM table1 AS t1
JOIN table2 AS t2 ON t1.group_id = t2.id
GROUP BY t1.client_name
HAVING num_groups > 1
AND FIND_IN_SET('Group1', merge_group)

のデフォルトのセパレータとしてコンマが使用されるためGROUP_CONCAT()、各グループをセットとしてフィルタリングできます。REGEXP多くの場合、 orよりも安全ですLIKE。上記の場合に簡単に使用できる文字列内の単語を検索しますが、1 つのグループ名が別のグループ名の部分文字列である大きなデータセットで使用するのは危険です。

于 2021-10-04T10:11:10.520 に答える