2

私は次のように設定されたmysqlテーブルを持っています:

id uid キーワード
-- --- ---
1 20 法人
2 20 企業、ビジネス、戦略
3 20 コーポレート、クッパ
4 20 花
5 20 戦艦、企業、ダンジョン

私の出力がどのように見えるかは次のとおりです。

20 企業、ビジネス、戦略、クッパ、花、戦艦、ダンジョン

しかし、私が得た最も近いものは次のとおりです。

SELECT DISTINCT uid, GROUP_CONCAT(DISTINCT キーワード ORDER BY キーワード DESC) AS キーワード
 FROM マイテーブル
 WHERE uid !=0
 GROUP BY uid

出力:

20 企業,企業,ビジネス,戦略,企業,クッパ,花,戦艦,企業,ダンジョン

誰かが解決策を持っていますか?事前にたくさんの感謝を!

4

4 に答える 4

5

あなたがしていることは、データが構造化されている方法で純粋な SQL を使用することはできません。

"Corporate" と "Corporate, Business" を見て、それらを等しい文字列と見なす SQL 実装はありません。したがって、個別は機能しません。

データベースを制御できれば、

最初に行うことは、データ設定を次のように変更することです。

id   uid   keyword     <- note, not keyword**s** - **ONE** value in this column, not a comma delimited list
1    20    corporate
2    20    corporate
2    20    business
2    20    strategy

さらに良いでしょう

id   uid   keywordId    
1    20    1
2    20    1
2    20    2
2    20    3

キーワード用の別のテーブルを使用

KeywordID    KeywordText
1            Corporate
2            Business

それ以外の場合は、コードでデータをマッサージする必要があります。

于 2009-10-15T04:50:48.047 に答える
1

うーん、キーワードは独自のテーブルにある必要があります (キーワードごとに 1 つのレコード)。そうすれば、キーワードが適切にグループ化されるため、それが可能になります。

于 2009-10-15T04:51:05.253 に答える
0

私が見ているように、あなたには2つの選択肢があります。

オプション1:

データの保存方法を変更します (独自のテーブルにキーワードを格納し、多対多の関係を使用して既存のテーブルをキーワード テーブルと結合します)。これにより、DISTINCT を使用できるようになります。現在、DISTINCT は機能しません。これは、クエリが "corporate" と "corporate,business,strategy" を 2 つの異なる値として認識しているためです。

オプション 2:

キーワード文字列を分割する「興味深い」SQL を記述します。MySQL の制限がどのようなものかはわかりませんが、SQL は一般にこのように設計されていません。

于 2009-10-15T04:56:09.027 に答える
0

MySql にこれがあるかどうかはわかりませんが、SQL Server には RANK() OVER PARTITION BY があり、これを使用して各結果にランクを割り当てることができます...そうすることで、ランク 1 のものだけを選択し、残りを破棄することができます。

于 2009-10-15T04:47:21.733 に答える