5

私は2つのテーブルを持っています

カンマで区切られたユーザーのリストを含むTable1

Name    UserID
abc     A,B,C,D
def     A,B,C

表2

Name   UserID
abc    A
abc    B
abc    C
def    A
def    B

名前ごとにtable1にあるが、table2にはないユーザーを見つける必要があります(UserIDとNameのペアがtable2に存在するが、CSVとしてtable1には存在しない場合のインスタンスはありません)。

出力は次のようになります

Name    UserID
abc     D
def     C

PHPでこれを行うことはできますが、クエリを介してこれを行う方法はありますか?これをクエリとして実行している場合に備えて、どこから始めればよいかわかりません。区切り文字としてコンマを使用してMySQLで解析できますか?

4

2 に答える 2

3

テストデータをSQLFiddleのテストスキーマに接続し、次のクエリを実行しました。

テストと肯定的な結果を含むSQLFiddleへのリンクは次のとおりです。http://sqlfiddle.com/#!2/83dfd / 4/0

クエリは次のとおりです。

SELECT
COALESCE(NORMALIZED_TABLE1.NAME, TABLE2.NAME) AS NAME,
COALESCE(NORMALIZED_TABLE1.USERID, TABLE2.USERID) AS USERID
FROM (
     SELECT NAME,
     SUBSTRING(
          USERID
          FROM CASE
               WHEN INDEX_TABLE.POS = 1 THEN 1
               ELSE INDEX_TABLE.POS + 1
               END
          FOR CASE LOCATE(',', USERID, INDEX_TABLE.POS + 1)
              WHEN 0 THEN CHARACTER_LENGTH(USERID) + 1
              ELSE LOCATE(',', USERID, INDEX_TABLE.POS + 1)
              END
              - CASE
                WHEN INDEX_TABLE.POS = 1 THEN 1
                ELSE INDEX_TABLE.POS + 1
                END
     ) AS USERID
     FROM TABLE1
     INNER JOIN (
          SELECT @rownum:=@rownum+1 POS
          FROM (
             SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
             UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
             UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
          ) a, (
             SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
             UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
             UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
          ) b, (
             SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
             UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
             UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
          ) c, (SELECT @rownum:=0) r
     ) INDEX_TABLE
     ON INDEX_TABLE.POS <= CHAR_LENGTH(TABLE1.USERID)
     AND (
          INDEX_TABLE.POS = 1
          OR SUBSTRING(USERID FROM INDEX_TABLE.POS FOR 1) = ','
     )
) AS NORMALIZED_TABLE1
LEFT OUTER JOIN TABLE2
ON NORMALIZED_TABLE1.NAME = TABLE2.NAME
AND NORMALIZED_TABLE1.USERID = TABLE2.USERID
WHERE TABLE2.NAME IS NULL;

table1の列幅が非常に長い場合は、「INDEX_TABLE」サブクエリを展開する必要がある場合があります。次のリンクのコードをコピーして貼り付けることができます:http:
//www.experts-exchange.com/Database/MySQL/A_3573-A-MySQL-Tidbit-Quick-Numbers-Table-Generation.html

于 2012-11-23T21:22:46.757 に答える
0

テーブルが固定されている場合(これらのテーブルで作業する必要がある場合)、事前定義されたテーブルからセットデータを直接保存するのではなく、テーブルからデータを読み取るクラスを設計します。オブジェクトが読み取りデータをアプリケーションドメイン全体でライブで処理できるようにして、本格的なアクセシビリティを実現します。:-D

于 2012-11-05T03:47:27.417 に答える