Итак, недавно унаследованный проект, настолько старый, что никто, кто был вовлечен в него, больше не работает в этой компании, в этом проекте есть база данных, и в этой базе данных у меня есть несколько таблиц:
TableA: userID | attrA | attrB | ... | role | flag | TableB: parent | child |
1 | A | B | ... | 1 | 1 | 1 | 2 |
etc. 1 | 3 |
2 | 5 |
5 | 17 |
(Никогда видел это в реляционной базе данных раньше, но увы)
Итак, написал запрос, очень похожий на этот (MySQL 5.7):
SELECT
@parents := user.userID as ID,
user.attrA as A,
user.attrB as B,
IFNULL(
(SELECT @parents AS inner
FROM (SELECT parent, child FROM TableB ORDER BY child, parent) roles
WHERE FIND_IN_SET(parent, @parents)
AND @parents := IF(FIND_IN_SET(child, @parents), @parents, CONCAT(@parents, ',', child))
ORDER BY inner DESC LIMIT 1),
@parents
) AS roles
FROM TableA WHERE userID = ? AND flag = 1
В результате получается что-то вроде
ID | A | B | roles
1 | A | B | 1,2,3,5,17
Который вызывается сервером. Теперь, вот серия событий, которые развернулись: написать запрос, протестировать его, работает идеально и согласованно, больше ничего не добавлять, выключить компьютер, на следующий день, загрузить компьютер, запустить сервер, запрос больше не работает на сервере. Внутренний запрос будет ... Ну, я не знаю, что он делает. Он всегда дает мне роли == ID, но удаление функции IFNULL не меняет этого факта, я думал, что это может быть потому, что ID был int, преобразование в char также ничего не меняет. Кроме того, выполнение запроса вручную через командную строку и через интерфейс по-прежнему работает идеально каждый раз. Я возился дальше, и получается, что если я выполню запрос дважды, прежде чем использовать его на стороне сервера, во второй раз он работает.
Итак, учитывая, что я сделал ровно ноль изменений в кодовой базе между тем, чтобы она работала, а она нет, я понятия не имею, с чего бы вообще начать пытаться это выяснить. Я бы предположил, что у меня есть проблема с областью действия или временем жизни, из-за которой переменная @parents
перезаписывается или обнуляется, или что-то в этом роде, но ... Я имею в виду, опять же, она работает везде, где я пытался ее использовать. Надежды на проблему очевидны, и кому-то еще будет легко указать на это.
Приветствия.