我有两个表,我需要获取不在另一个表中的所有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使用几个,但没有任何作用。
答案 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