Внутренние select
запросы возвращают несколько строк.Это не разрешено в выражении if
.Это будет разрешено в чистом in
выражении, но как только вы используете if
, оно больше не будет сохраняться.
Так что переведите вашу идею в серию OR
:
SELECT *
FROM message
WHERE seen = '0'
AND receiver_delete ='0'
AND till_date IS NULL
AND ( (to_ = 'user' AND id_receiver = '36')
OR (to_ = 'group' AND id_receiver IN (
SELECT id
FROM (
SELECT *
FROM user_position
ORDER BY id) user_position,
(SELECT @pv := '100') initialisation
WHERE FIND_IN_SET(parent_id, @pv) > 0
AND @pv := concat(@pv , ',' , id)
))
OR (to_ NOT IN ('user', 'group') AND id_receiver IN (
SELECT message_group.id
FROM message_group
LEFT JOIN message_group_member
ON message_group_member.id_group=message_group.id
WHERE message_group_member.id_user='36'
))
)
Замечу, что вы используете переменные в первом внутреннем запросе.Будьте осторожны с этим, так как нет гарантии относительно порядка исполнения.Я вижу, что подзапрос вдохновлен другим моим ответом , но, пожалуйста, примите к сведению все отказы от ответственности и предупреждения в этом ответе.Они применяются здесь.
Если можете, перейдите на MySql 8 и рекурсивный синтаксис with
.