Mysql GROUP CONCAT не возвращает значения

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

SELECT 
    SUM(o.order_disc + o.order_disc_vat) AS manualsale
FROM
    orders o
WHERE
    o.order_flag IN (0 , 2, 3)
        AND o.order_status = '1'
        AND (o.assign_sale_id IN (SELECT GROUP_CONCAT(CAST(id AS SIGNED)) AS ids FROM users WHERE team_id = 92))
        AND DATE(o.payment_on) = DATE(NOW())

выше запрос возвращает ноль, когда я запускаю этот запрос в терминале

Когда я использую подзапрос ниже, он возвращает данные

SELECT GROUP_CONCAT(CAST(id AS SIGNED)) AS ids FROM users WHERE team_id = 92)

вышеуказанный запрос возвращает

'106,124,142,179'

и когда я запускаю свой первый запрос, как показано ниже

SELECT 
    SUM(o.order_disc + o.order_disc_vat) AS manualsale
FROM
    orders o
WHERE
    o.order_flag IN (0 , 2, 3)
        AND o.order_status = '1'
        AND (o.assign_sale_id IN (106,124,142,179))
        AND DATE(o.payment_on) = DATE(NOW())

это возвращает мне значение. Почему не работает подзапрос, помогите

Какой тип данных у o.assign_sale_id

P.Salmon 10.12.2020 15:55

о. assign_sale_id имеет тип данных int

Mukesh Rawat 10.12.2020 16:12
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не делает то, что вы хотите:

AND (o.assign_sale_id IN (SELECT GROUP_CONCAT(CAST(id AS SIGNED)) AS ids FROM users WHERE team_id = 92))

Это сравнивает одно значение со списком значений, разделенных запятыми, поэтому оно никогда не совпадает (если только для данной команды нет только одной строки в пользователях).

Вы можете сформулировать это так:

AND assign_sale_id IN (SELECT id FROM users WHERE team_id = 92)

Но это, вероятно, было бы более эффективно выражено с помощью exists:

AND EXISTS(SELECT 1 FROM users u WHERE u.team_id = 92 AND u.id = o.assign_sale_id)

Примечание: я бы также рекомендовал переписать это условие:

AND DATE(o.payment_on) = DATE(NOW())

К следующему, который может воспользоваться индексом:

AND o.payment_on >= current_date AND o.payment_on < current_date + interval 1 day

Спасибо @GMB assign_sale_id IN (ВЫБЕРИТЕ идентификатор ОТ пользователей, ГДЕ team_id = 92) я использовал это, я не знаю, как я могу сделать эту глупую ошибку, спасибо за вашу помощь, приятель

Mukesh Rawat 10.12.2020 16:17

Другие вопросы по теме