Внутренние 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
.
Можно установить конкретную строку или ячейку, чтобы быть только для чтения, таким образом, пользователь не может изменить значение. Это то, что Вы имеете в виду?
dataGridView1.Rows[0].ReadOnly = true;
dataGridView1.Rows[1].Cells[2].ReadOnly = true;