Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如果值更改,则从计数中删除_Mysql_Select_Count_Locate - Fatal编程技术网

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)