MySQL, группа не соблюдает порядок по - PullRequest
0 голосов
/ 19 марта 2020

У меня есть этот запрос

SELECT * FROM ( 
    SELECT 
        wtb_orders.orderid,
        wtb_orders.duration,
        wtb_orders.is_renew,
        wtb_orders.bundle_id,
        wtb_orders.service_id,
        wtb_orders.object_name,
        wtb_orders.pkg_id_fk,
        expires,
        wtb_tokens.disconnect_time
    FROM wtb_orders
    JOIN wtb_tokens ON wtb_orders.orderid=wtb_tokens.orderid
    WHERE 
        wtb_orders.username= "11111111111" AND
        (
            (
                ((expires + INTERVAL 5 DAY) >= NOW()) OR 
                (expires=0 AND wtb_tokens.orderid IS NOT NULL)
            ) OR
            expires=0
        )
    ORDER by expires DESC
) as tmp
GROUP BY 
    tmp.pkg_id_fk, 
    tmp.bundle_id,
    tmp.service_id;

Я хочу заказать по expires, затем четко выбрать элементы, имеющие любой из tmp.pkg_id_fk, tmp.bundle_id,tmp.service_id не нуль.

Если 2 элемента имеют то же самое bundle_id например, я хочу выбрать тот, с более поздней датой expires.

запрос должен работать, если я не поставлю group by все хорошо, я использую группировать, чтобы отфильтровать дубликаты, и он решает выбрать один со старой датой истечения срока, как будто я не сортировал их.

Извините за задержку с предоставлением примера. Это пример

Итак, в первом запросе выбора я выбираю все, а во втором запросе выбора я использую группу по Просто чтобы вы могли увидеть разницу. Просто посмотрите на предметы, которые имеют pkg_id_fk = 35

Когда я делаю группу по, я ожидаю увидеть ту, у которой максимальный срок действия. Но вместо этого я вижу другую.

Причина в том, что Предположим, вы купили пакет, срок его действия истекает, поэтому вы продлили его, теперь у вас есть два дубликата пакетов. Я хочу, чтобы вы увидели самый новый.

1 Ответ

0 голосов
/ 20 марта 2020

Я хотел бы поделиться ответом, который я получил на Reddit от GreenPilgrim89, это блестящий ответ, хотя я не люблю его использовать в производстве, потому что он хакерский, если нет другой вариант. Он говорит, просто добавьте лимит для обеспечения исполнения заказа, и это сработало!

SELECT * FROM ( 
    SELECT 
        wtb_orders.orderid,
        wtb_orders.duration,
        wtb_orders.is_renew,
        wtb_orders.bundle_id,
        wtb_orders.service_id,
        wtb_orders.object_name,
        wtb_orders.pkg_id_fk,
        expires,
        wtb_tokens.disconnect_time
    FROM wtb_orders
    JOIN wtb_tokens ON wtb_orders.orderid=wtb_tokens.orderid
    WHERE 
        wtb_orders.username= "11111111111" AND
        (
            (
                ((expires + INTERVAL 5 DAY) >= NOW()) OR 
                (expires=0 AND wtb_tokens.orderid IS NOT NULL)
            ) OR
            expires=0
        )
    ORDER by expires DESC LIMIT 1000000 
) as tmp
GROUP BY 
    tmp.pkg_id_fk, 
    tmp.bundle_id,
    tmp.service_id;

Для получения дополнительной информации проверьте это и его пост, связанный выше.

...