0

環境:

私は次の表(例)を持っています:

| ID  |   name   | COUNTRY                  |
---------------------------------------------
| 1   | cristian | FRANCIA,HOLANDA,ALEMANIA |
| 2   | Andrea   | FRANCIA,ESPAÑA,BELGICA   |
| 3   | Fabian   | BELGICA,ALEMANIA         |

すべての国をフィールドに入力する必要がありますが、値が繰り返されないようにする必要があります。

だから、私は次のクエリを試しています:

select GROUP_CONCAT(DISTINCT(COUNTRY)) FROM  Usuario;

または正規表現を使用する

select GROUP_CONCAT(DISTINCT(COUNTRY)) FROM  Usuario
WHERE GROUP_CONCAT(COUNTRY) REGEXP 'somepattern'

間違った答えは次のとおりです。

FRANCIA,HOLANDA,ALEMANIA,FRANCIA,ESPAÑA,BELGICA,BELGICA,ALEMANIA

予想される答えは次のとおりです。

FRANCIA,HOLANDA,ALEMANIA,ESPAÑA,BELGICA

または、いくつかのストアドプロシージャを作成しますか?

N 個の値異なる値に対して、期待される答えを得る方法は?

あなたの知識と時間をありがとう!

4

3 に答える 3

0

このように一意になるためのmysqlの方法はありません。

まず、このように値を保存するのは悪いことです。

あなたには2つの解決策があります:

1- データベースを正規化します。

2-テーブルから値を取得して phpexplode()を使用し、使用array_uniqueして重複する値を削除します。

于 2013-08-23T18:06:52.557 に答える
0

MySQL には、これを行うための組み込み関数はありません。

MySQL で大量の文字列処理を実行することは可能ですが、それは見苦しく、コンマ区切りリスト内の文字列値の数には既知の有限の制限が必要です。

これらすべてのコンマ区切りリストからフィールド値の個別のリストを取得する 1 つの方法を次に示します。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',1),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',2),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',3),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',4),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',5),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',6),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 ORDER BY 1

それが何をしていて、どのように機能するかを理解するための演習として残しておきます。

これで、各値が別々の行に表示されました。そのままにしておくことをお勧めします。

そのクエリを別のクエリでラップし、GROUP_CONCAT 関数を使用して、コンマ区切りのリストを含む文字列値を含む単一の行を返すのは簡単です。

于 2013-08-23T18:24:48.747 に答える