1 つの列にカンマ区切りの値を含むテーブルを結合する
データベースを扱う場合、多くの場合、カンマを含む列に基づいてテーブルを結合する必要があります。 - で区切られた値。この特定のケースでは、テーブル C のカンマ区切り列 (「userids」) が特定の検索語に一致するユーザー名を取得しようとしています。
部分文字列抽出を使用した SQL クエリ
最初のクエリは、サブクエリを使用して、テーブル C の「userids」のカンマ区切り文字列から最初の値を抽出しようとしました。 カラム。ただし、このアプローチは、目的の値が常に文字列の先頭であると想定しているため、非効率的で信頼性が低くなります。
find_in_set を使用したクエリの改善
より良い解決策には、次の使用が含まれます。 MySQL の find_in_set 関数。カンマ区切り内の特定の値を検索できます。 string:
SELECT * FROM tblC c JOIN tblB b ON (find_in_set(b.userid, c.userids) > 0) WHERE c.nname = "new1"
このクエリは、テーブル C 内の "nname" 列が "new1" と一致する行に関連付けられているすべてのユーザー名を効率的に取得します。
正規化スキーマ代替
ただし、カンマ区切りの値を列に格納することは、推奨される習慣ではありません。データの整合性とパフォーマンスを向上させるには、ジャンクション テーブルを導入してスキーマを正規化することをお勧めします。
提供された例では、次の 2 つの列を持つ新しいジャンクション テーブル (tblC_user) を作成できます: c_id (テーブルへの外部キー) C) とユーザー ID (テーブル B への外部キー)。これにより、カンマ区切りの文字列を必要とせずに、テーブル C と B の間の多対多の関係を表すことができます。
正規化されたクエリ
正規化されたクエリの使用スキーマを使用している場合、次のクエリを使用して目的の結果を取得できます:
SELECT * FROM tblC c JOIN tblC_user cu ON (c.id = cu.c_id) JOIN tblB b ON (b.userid = cu.userid) WHERE c.nname = "new1"
このクエリカンマ区切り値に基づいてテーブルを結合する、より効率的かつ信頼性の高い方法を提供します。
以上がMySQL データベースでカンマ区切り値を使用してテーブルを効率的に結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。