MySQL:如果值更改,则从计数中删除
这是我的查询,我正在为MySQL:如果值更改,则从计数中删除,mysql,select,count,locate,Mysql,Select,Count,Locate,这是我的查询,我正在为carton\u id选择计数,但是如果这个纸箱在某个时候被转移到它的'assign\u id',那么我希望从这个计数中删除它。 我不能使用“==”,因为assign\u id始终是一个逗号分隔的字符串,如“24,25”,但divert\u id将是其中一个或“999” 因此,结果应该是: 24,26 | 0 但是我得到的计数是1。如果使用LOCATE,它会获取assign id中的子字符串divert\u id,在本例中是24/24,26,结果LOCATE(divert
carton\u id
选择计数,但是如果这个纸箱在某个时候被转移到它的'assign\u id',那么我希望从这个计数中删除它。
我不能使用“==”,因为assign\u id始终是一个逗号分隔的字符串,如“24,25”,但divert\u id将是其中一个或“999”
因此,结果应该是:
24,26 | 0
但是我得到的计数是1。如果使用LOCATE,它会获取assign id中的子字符串divert\u id,在本例中是24/24,26,结果LOCATE(divert\u id,assign\u id)不等于零。同时通过分配id和转移id检查分组。希望这有帮助。使用此选项代替您的计数:
COUNT(DISTINCT
CASE WHEN NOT EXISTS (
SELECT 1 FROM induction
WHERE assign_id = i.assign_id
AND CONCAT(',', assign_id, ',') LIKE CONCAT('%,', divert_id, ',%')
) THEN i.carton_id END
)
我使用LIKE
而不是LOCATE
,因为LOCATE
会返回假阳性,例如divert\u id
是2
和assign\u id
是20,21
请参阅简化的。
还可以尝试以下方法:
MIN(CONCAT(',', assign_id, ',') NOT LIKE CONCAT('%,', divert_id, ',%')) * COUNT(DISTINCT carton_id)
查看简化的。
您能添加一些示例吗example@Ravi你在找一些样本数据吗?我更新了我的问题。我想我无法解释我的问题。我知道LOCATE在那里做什么,但我想要的是,如果数据与我的样本数据相似,那么结果应该是
0
,但我得到的结果是3
,因为LOCATE将返回“0”在上面的例子中是3次。这是有道理的,但不幸的是MySQL连接对我来说超时了,因为我的数据大小是160k行。可能需要一些优化的解决方案..:(
COUNT(DISTINCT
CASE WHEN NOT EXISTS (
SELECT 1 FROM induction
WHERE assign_id = i.assign_id
AND CONCAT(',', assign_id, ',') LIKE CONCAT('%,', divert_id, ',%')
) THEN i.carton_id END
)
MIN(CONCAT(',', assign_id, ',') NOT LIKE CONCAT('%,', divert_id, ',%')) * COUNT(DISTINCT carton_id)