login  Naam:   Wachtwoord: 
Registreer je!
 Forum

MySQL Sub-Query

Offline dbe123 - 12/02/2010 16:38 (laatste wijziging 12/02/2010 16:39)
Avatar van dbe123Lid Hoi,

Ik probeer een MySQL sub-query te maken, maar krijg het niet voor elkaar.

  1. SELECT DISTINCT contact, name
  2. FROM table1
  3. WHERE id=(SELECT max(id) FROM table1 WHERE LOWER(contact) LIKE '%van%')
  4. GROUP BY name


Ik probeer 2 kolommen uit een tabel te krijgen, waar ik de criteria op toepas, zoals in bovenstaande code.

De bedoeling is om eerst de query uit te voeren op de kolom "contact", die je een lijst weergeeft met gevonden resultaten. Vervolgens moet ik van de weergegeven resultaten enkel de hoogste ID zien, gegroepeerd per naam.

Bovenstaande code geeft me enkel de hoogste ID waarde...

Kan iemand me helpen?

Thanks

3 antwoorden

Gesponsorde links
Offline Martijn - 12/02/2010 16:56
Avatar van Martijn Crew PHP ik zou je subquery dan een LIMIT 2 geven, en je hoofdquery moet dan doen
WHERE id IN
Offline Arnold - 12/02/2010 20:11
Avatar van Arnold Nieuw lid de query die je specificeert is niet echt optimaal geschreven. Onderstaande zou al een beter optie zijn:

SELECT contact, name
FROM table1
WHERE LOWER(contact) LIKE '%van%'
ORDER BY id DESC
LIMIT 1

Waarom is dit sneller? Je database hoeft nu niet tweemaal een query uit te voeren, omdat je id waarschijnlijk de pk is, hoeft hij alleen een index probe te doen om te sorteren.

Anderzijds blijft de functie LOWER traag, omdat hierbij niet gebruik kan worden gemaakt van een index alle rijen van de tabel worden nu opgevraagd om het veld contact naar lowercase te veranderen en te controleren. Daarnaast is like ook niet snel.
Offline dbe123 - 12/02/2010 20:39
Avatar van dbe123 Lid
Arnold schreef:
de query die je specificeert is niet echt optimaal geschreven. Onderstaande zou al een beter optie zijn:

SELECT contact, name
FROM table1
WHERE LOWER(contact) LIKE '%van%'
ORDER BY id DESC
LIMIT 1

Waarom is dit sneller? Je database hoeft nu niet tweemaal een query uit te voeren, omdat je id waarschijnlijk de pk is, hoeft hij alleen een index probe te doen om te sorteren.

Anderzijds blijft de functie LOWER traag, omdat hierbij niet gebruik kan worden gemaakt van een index alle rijen van de tabel worden nu opgevraagd om het veld contact naar lowercase te veranderen en te controleren. Daarnaast is like ook niet snel.


Ok thanks, maar even voor mijn beeldvorming:
1. met deze query, krijg ik dan alle "Contacts" die de string "van" bevatten?
2. beperkt de LIMIT functie de query niet tot het geven van één enkele waarde?

Misschien moet ik mijn vraag wat duidelijker maken.
Wat ik wil bereiken, is dat een gebruiker een (deel van een) contactnaam ingeeft, en vervolgens de contactnamen te zien krijgt in een lijstje (met de hostname van de PC van de gezochte contactnaam).

Het huidige probleem is dat de database waar deze query op gedraaid wordt, wekelijks een update doet.
Dit systeem voegt echter steeds data toe, maar verwijderd geen gegevens in de tabel.  
Resultaat is dat de database:
1. steeds groeit
2. er dubbels in de database terecht komen (bijvoorbeeld contact A heeft een nieuwe pc gekregen, met een nieuwe Hostname, dus hij staat 2x in de database).

Dit database-systeem (een soort van Network Sniffer) is een aangekochte applicatie van mijn werkgever, en we kunnen er niks aan wijzigen.
De leverancier is met een nieuwe versie bezig waar de database ook een TRUNCATE functie zal bevatten om de dubbels te verwijderen, maar dit kan nog een tijdje duren.
Tot die tijd moet ik met het huidige systeem verder.

Ik hoop dat dit het wat duidelijker maakt.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.17s