使用find_in_set获取不在第二个表中的值

时间:2015-05-14 16:47:49

标签: mysql find-in-set

我有两个表,我需要获取不在另一个表中的所有store_id的列表

BusinessUnit Table   User Table
StoreId(varchar)     StoreId(varchar)
1                    1,2
2                    3,4
3                    1,5
4                    4,6
7                    4

如何获取业务单位表中不存在但存在于用户表中的商店5,6的值?试图使用find_in_set使用几个,但没有任何作用。

2 个答案:

答案 0 :(得分:0)

如果您知道所有可能的值(以及它们的数量是合理可管理的),您可以使用它们填充新表(您可以将其设为TEMPORARY或稍后将其删除),并执行此操作

SELECT * 
FROM (
      SELECT allIDs.Id 
      FROM allIDs 
         INNER JOIN `User` AS u 
         -- ON CONCAT(',', u.StoreID, ',') LIKE CONCAT('%,', allIDs.Id, ',%')
         ON FIND_IN_SET(allIDs.Id, u.StoreID)
   ) AS IDsInUserTable
   LEFT JOIN `BusinessUnit` AS b ON IDsInUserTable.Id = b.StoreID
HAVING b.StoreID IS NULL
;

在此示例中,allIDs是上述“可能的值”表。

答案 1 :(得分:0)

使用SUBSTRING_INDEX获取CSV字段中的所有值。由于CSV中最多可以有6个ID,因此您需要为每个位置调用一次。

SELECT u.StoreId
FROM (
    select substring_index(StoreId, ',', 1) AS StoreID
    FROM User
    UNION
    select substring_index(substring_index(StoreId, ',', 2), ',', -1)
    FROM User
    UNION
    select substring_index(substring_index(StoreId, ',', 3), ',', -1)
    FROM User
    UNION
    select substring_index(substring_index(StoreId, ',', 4), ',', -1)
    FROM User
    UNION
    select substring_index(substring_index(StoreId, ',', 5), ',', -1)
    FROM User
    UNION
    select substring_index(substring_index(StoreId, ',', 6), ',', -1)
    FROM User) AS u
LEFT JOIN BusinessUnit AS b ON u.StoreId = b.StoreID
WHERE b.StoreId IS NULL

DEMO