5

この問題について助けが必要です。

MYSQLテーブルにはフィールドがあります:

Field  : artist_list  
Values : 1,5,3,401

アーティスト uid 401 のすべてのレコードを検索する必要があります

私はこれをします

SELECT uid FROM tbl WHERE artist_list IN ('401');

artist_list フィールドの値が「401」のみのすべてのレコードがありますが、11,401 の場合、このクエリは一致しません。

何か案が ?

(アーティストの uid が 3 の場合 (30、33、3333 に一致するため)、ユーザーの LIKE メソッドを使用できません...

4

3 に答える 3

11

短期的な解決策

FIND_IN_SET 関数を使用します。

SELECT uid 
  FROM tbl 
 WHERE FIND_IN_SET('401', artist_list) > 0

長期的な解決策

データを正規化します。これは、すでに 2 つのテーブルを含む多対多の関係のようです。コンマ区切りのリストは、独自のテーブルに変換する必要があります。

ARTIST_LIST

  • artist_id (主キー、ARTIST への外部キー)
  • uid (主キー、TBL への外部キー)
于 2010-10-15T23:24:53.273 に答える
2

データベースの編成が問題です。正規化する必要があります。コンマで区切られた値のリストを含む 1 つの行を作成するのではなく、行ごとに 1 つの値を実行する必要があります。

uid    artist
1      401
1       11
1        5
2        5
2        4
2        2

次に、クエリを実行できます。

SELECT uid
  FROM table
 WHERE artist = 401

また、データベースの正規化も検討する必要があります。これは、将来的にますます多くの問題が発生するためです。

于 2010-10-15T23:29:10.240 に答える
2
SELECT uid
FROM tbl
WHERE CONCAT(',', artist_list, ',') LIKE '%,401,%'

そもそもデータを適切に正規化する方が理にかなっていますが。その後、クエリは簡単になり、パフォーマンスが大幅に向上します。

于 2010-10-15T23:24:46.787 に答える