Query mogelijk te versnellen/vereenvoudigen?

Status
Niet open voor verdere reacties.

caspar1966

Nieuwe gebruiker
Lid geworden
21 apr 2012
Berichten
4
Hallo, ik wil een goede (en snellere!) query voor het volgende...

Een 'customer' kan meerdere 'orders' hebben met verschillende 'statussen'.
Ik wil nu graag alleen die 'customers' hebben die helemaal geen 'order' hebben met 'orders_status' = 3

Dit is wat ik er van gebakken heb, maar hij is ergggg traag... (±10000 orders)

SELECT distinct(customers_id)
FROM orders
WHERE customers_id NOT IN (
SELECT customers_id
FROM orders
WHERE orders_status = 3)

Kan dit anders?
Alvast bedankt!
 
Traagheid van een query kan ook door de tabel komen. Zit er wel een index op customers_id?
 
Ik neem aan dat je de tabel orders bedoelt.
"orders_id" is de index van de tabel orders.
 
Laatst bewerkt:
Omdat je in de where de kolom customers_id gebruikt is het verstandig daar ook een index op te zetten.

Verder is het een kwestie van uitproberen. Bijvoorbeeld met not exists, al betwijfel ik of dat veel sneller zal zijn.
[sql]SELECT DISTINCT(customers_id)
FROM orders o1
WHERE NOT EXISTS
( SELECT 'status 3'
FROM orders o2
WHERE o2.orders_status = 3
AND o2.customers_id = o1.customers_id
)[/sql]

Misschien een beetje creatief, maar wellicht dat je hier wel wat winst mee kunt maken omdat je maar 1 keer de tabel in hoeft.
[sql]SELECT DISTINCT(customers_id)
FROM orders
GROUP BY customers_id
HAVING NOT FIND_IN_SET( 3, GROUP_CONCAT( orders_status ) )[/sql]
 
Ik ken MySQL niet hoor maar waarom niet gewoon zo?
Zo zou het bij de bij mij bekende SQL implementatie werken.
Code:
SELECT distinct(customers_id)
FROM orders
WHERE orders_status != 3
 
Jouw query gaat niet werken edmoor, want die pakt bijvoorbeeld wel een customer die een order heeft met status 1 en order met een status 3.
Die customer wil ik niet. Een customer mag dus absoluut geen order hebben met status 3....

En Epic, die tweede zou sneller kunnen werken, als ik 'm begreep.... in die laatste regel is "find_in_set" nieuw voor mij.
Ik ga eens even googlen wat dit precies doet.

Bedankt!
 
Fantastisch Epic, het werkt en snel!!!
mijn Query deed voor 20 resultaten er 5 seconden over (belachelijk langzaam) en de jouwe 0,02 sec....
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan