Подзапрос возвращает более 1 строки ошибки, хотя я использую ключевое слово "IN" - PullRequest
0 голосов
/ 19 января 2019

Хотя я использую ключевое слово "IN", я получаю Subquery returns more than 1 row ошибку.

Вот мой запрос:

SELECT * 
FROM `message` 
WHERE `id_receiver` IN ( 
    IF( `to_`='user' , '36' , 
        IF( `to_`='group' , ( 
            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` ) 
            ), ( 
            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' 
        )
    ) 
)
AND `seen`='0'
AND `receiver_delete`='0'
AND `till_date` IS NULL

1 Ответ

0 голосов
/ 19 января 2019

Внутренние 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...