fix: MySQL variables can't be used inside IN statements as such

So, if we want to do something like "WHERE abc IN ( @ids )", where @ids
would contain a string of "1,2,3", we can't and would need to use
FIND_IN_SET() function instead.
This commit is contained in:
Martin Ambrus
2017-10-27 19:36:27 +02:00
parent 576dfdf950
commit 0d84b5f3b4
+135 -3
View File
@@ -59,7 +59,19 @@ UPDATE %PREFIX%odata
WHERE WHERE
@natureRegTime = -1 @natureRegTime = -1
AND AND
conqured IN ( @village ); (
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(conqured, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
conqured = @village
)
);
-- --------------------------------------------- -- ---------------------------------------------
-- remove past reports (conquered > unoccupied) -- remove past reports (conquered > unoccupied)
@@ -68,7 +80,19 @@ DELETE FROM %PREFIX%ndata
WHERE WHERE
@natureRegTime = -1 @natureRegTime = -1
AND AND
toWref IN ( @village ); (
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(toWref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
toWref = @village
)
);
-- ---------------------------------------------------------------- -- ----------------------------------------------------------------
@@ -81,7 +105,19 @@ SET
WHERE WHERE
@natureRegTime > -1 @natureRegTime > -1
AND AND
wref IN ( @village ); (
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(wref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
wref = @village
)
);
-- ----------------------------------------------------------------------- -- -----------------------------------------------------------------------
@@ -116,9 +152,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND AND
( (
u35 <= ( u35 <= (
@@ -172,9 +220,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND AND
( (
u36 <= ( u36 <= (
@@ -226,9 +286,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND u31 <= ( AND u31 <= (
CASE o.high CASE o.high
WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0)) WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0))
@@ -278,9 +350,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND u31 <= ( AND u31 <= (
CASE o.high CASE o.high
WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0)) WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0))
@@ -329,9 +413,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND u31 <= ( AND u31 <= (
CASE o.high CASE o.high
WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0)) WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0))
@@ -381,9 +477,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND u31 <= ( AND u31 <= (
CASE o.high CASE o.high
WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0)) WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0))
@@ -434,9 +542,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND u31 <= ( AND u31 <= (
CASE o.high CASE o.high
WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0)) WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0))
@@ -495,9 +615,21 @@ UPDATE %PREFIX%units u
( (
@village > -1 @village > -1
AND AND
(
(
-- should we have a list of IDs, we need to use FIND_IN_SET
LOCATE(",", @village) > 0
AND
FIND_IN_SET(vref, @village)
)
OR
(
-- for a single ID, we use a simple condition which can definitely use an index as well
vref = @village vref = @village
) )
) )
)
)
AND u31 <= ( AND u31 <= (
CASE o.high CASE o.high
WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0)) WHEN 0 THEN (FLOOR(@minUnitsForOasis0 + RAND() * @maxUnitsForOasis0))