2017-12-29 7 views
-1

Ich habe 2 Tabellen: orders, orders_othersMYSQL - MINDESTENS Zustand mit Fall

In orders, ich habe 2 wichtige Säulen: priority_date, date_end

In orders_others, ich habe 1 wichtige Säule: date_to

Ich möchte nächste Bestellung (mit 2 Tabellen) suchen, aber nächstes Datum muss >= CURRENT DATE

sein MySQL Code:

SELECT 
    users.*, 
    LEAST(
     MIN(
      CASE WHEN orders.date_end >= CURDATE() THEN orders.date_end ELSE "9999-99-99 99:99:99" END 
     ), 
     MIN(
      CASE WHEN orders_others.date_to >= CURDATE() THEN orders_others.date_to ELSE "9999-99-99 99:99:99" END 
     ), 
     MIN(
      CASE WHEN orders.priority_date >= CURDATE() THEN orders.priority_date ELSE "9999-99-99 99:99:99" END 
     ) 
    ) as next_order, 
    MIN(
     CASE WHEN orders.date_end >= CURDATE() THEN orders.date_end ELSE "9999-99-99 99:99:99" END 
    ) AS next_ending, 
    MIN(
     CASE WHEN orders_others.date_to >= CURDATE() THEN orders_others.date_to ELSE "9999-99-99 99:99:99" END 
    ) AS next_order_others, 
    MIN(
     CASE WHEN orders.priority_date >= CURDATE() THEN orders.priority_date ELSE "9999-99-99 99:99:99" END 
    ) as next_priority_date 
FROM 
    `users` 
    LEFT JOIN `orders` ON `orders`.`idu` = `users`.`id` 
    LEFT JOIN `orders_others` ON `orders_others`.`unique` = `orders`.`unique` 
    AND `orders_others`.`date_to` >= (
     CURDATE() - INTERVAL 1 YEAR 
    ) 
WHERE `next_order`>='2017-12-30 00:00:00' 
GROUP BY 
    `users`.`id` 
ORDER BY 
    `next_order` ASC 
LIMIT 
    10 

Ergebnis: Unknown column 'next_order' in 'where clause'

Wenn ich die Bedingung löschen fein :)

+1

Einsatz, wo vor Gruppe von –

+0

Siehe https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to -be-a-very-simple-sql-query – Strawberry

Antwort

2

die Variable arbeitet, kann nicht direkt zuordnen wo Bedingung und wo sollte kurz nach FROM sein, so dass Sie die Bedingung in having-Klausel bereitstellen können.

SELECT 
users.*, 
LEAST(
    MIN(
     CASE WHEN orders.date_end >= CURDATE() THEN orders.date_end ELSE "9999-99-99 99:99:99" END 
    ), 
    MIN(
     CASE WHEN orders_others.date_to >= CURDATE() THEN orders_others.date_to ELSE "9999-99-99 99:99:99" END 
    ), 
    MIN(
     CASE WHEN orders.priority_date >= CURDATE() THEN orders.priority_date ELSE "9999-99-99 99:99:99" END 
    ) 
) as next_order, 
MIN(
    CASE WHEN orders.date_end >= CURDATE() THEN orders.date_end ELSE "9999-99-99 99:99:99" END 
) AS next_ending, 
MIN(
    CASE WHEN orders_others.date_to >= CURDATE() THEN orders_others.date_to ELSE "9999-99-99 99:99:99" END 
) AS next_order_others, 
MIN(
    CASE WHEN orders.priority_date >= CURDATE() THEN orders.priority_date ELSE "9999-99-99 99:99:99" END 
) as next_priority_date 
FROM 
`users` 
LEFT JOIN `orders` ON `orders`.`idu` = `users`.`id` 
LEFT JOIN `orders_others` ON `orders_others`.`unique` = `orders`.`unique` 
AND `orders_others`.`date_to` >= (
    CURDATE() - INTERVAL 1 YEAR 
) 

GROUP BY 
`users`.`id` having `next_order` >= '2017-12-30 00:00:00' 
ORDER BY 
`next_order` ASC 
LIMIT 10 
+0

Ergebnis: Ungültige Verwendung der Gruppenfunktion –

+0

Bitte überprüfen Sie die aktualisierte Antwort –

+1

perfekte Antwort! Frohes Neues Jahr :) –