Я бы рекомендовал шаблон, как показано ниже. Ключевое значение возвращает null
, чтобы указать «пожалуйста, не перенаправляйте».
public ActionResult SomeAction()
{
var predefinedRedirect = MaybeRedirect();
if (predefinedRedirect != null)
return predefinedRedirect;
// The rest of the code
}
private ActionResult MaybeRedirect()
{
if (Session["level"] == null)
return RedirectToAction("Home", "Whatever");
if ((int)Session["level"] == 1)
return RedirectToAction("Choose", "Whatever");
... // other conditions here
return null;
}
Внутренние 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
.