mysql - 使用逗号作为分隔符在 MySQL 中解析

标签 mysql

我有两张 table

用逗号分隔的用户列表的表 1

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

表2

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

我需要为每个名称找到在表 1 中但不在表 2 中的用户(当 UserID 到名称对存在于表 2 中但不在表 1 中作为 CSV 时,永远不会有实例)。

输出应该是

Name    UserID
abc     D
def     C

我可以用 PHP 做到这一点,但是有没有一种方法可以通过查询来做到这一点?如果我要这样做,我不确定从哪里开始作为查询。我可以在 MySQL 中使用逗号作为分隔符进行解析吗?

最佳答案

我将您的测试数据插入到 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

关于mysql - 使用逗号作为分隔符在 MySQL 中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13225620/

相关文章:

mysql - 如何加入 MySQL 查询

PHP MySQL : COUNT/SUM a non integer column with different values

php - mysql 和 php 中的 AES 加密

mysql - 如何使用 SQL 使用当前值的子字符串更新值

php - Paypal IPN 数据未进入数据库

mysql - PhpMyAdmin:主 A_I 列旁边的数字是什么意思?

c++ - Qt远程数据库与MySql?

php - 编辑 MySQL 行 PHP

php - Prepared Statements 对于普通查询来说是一种浪费吗? (PHP)

mysql - 用大量测试数据填充数据库表