如果您总是选择表中的所有行:
SELECT pid, name, field, idx
FROM (
SELECT pid, name, field,
@pos := IF(name = 'A3', @idx, @pos),
@idx := @idx + IF(name = 'A3', 2, 1), idx
FROM mytable, (SELECT @pos = -1, @idx := 0) dm
WHERE name <> 'A2'
ORDER BY RAND()
)
UNION SELECT pid, name, field, @pos + 1 idx
FROM mytable
WHERE name = 'A2'
ORDER BY idx;
如果您并非总是返回所有行,则需要检查是否已返回 A3
以判断是否应包括A2
:
SELECT pid, name, field, idx
FROM (
SELECT pid, name, field,
@pos := IF(name = 'A3', @idx, @pos),
@idx := @idx + IF(name = 'A3', 2, 1), idx
FROM mytable, (SELECT @pos = -1, @idx := 0) dm
WHERE name <> 'A2'
ORDER BY RAND()
LIMIT 4
)
UNION SELECT pid, name, field, @pos + 1 idx
FROM mytable
WHERE @pos != -1 AND name = 'A2'
ORDER BY idx;