Toon posts:

[SQL] DISTINCT en ORDER BY *

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo.

Ik heb een vraag, waar ik niet helemaal uitkom.

Ik heb een on-line puzzelwoordenboek gemaakt en werkt prima zoals ik wil.
Maar nu wil ik iets uitbreiden, waar ik totaal niet uitkom.
De woorden zitten momenteel als volgt in de database:
IDOMSCHRIJVINGBETEKENIS
1Deel van een huisdak, eetkamer, kamer, keuken, slaapkamer, zolder
2Straathandelaarventer
3Wegpad, straat, zoek

De uitbreiding die ik wil doen, is om op lengte te kunnen zoeken. Stel, je typt in bij omschrijving 'deel' en bij aantal letters '6'. Dan moet je de moet je als resultaat krijgen:

Deel van een huis - keuken, zolder
Straathandelaar - venter
Weg - straat


Dat lukt op zich wel, met de volgende mysql query:
"SELECT * FROM woorden WHERE (omschrijving LIKE '".$zoekwoord."%' OR omschrijving LIKE '".$zoekwoord2."%' OR omschrijving LIKE '".$zoekwoord3."%') AND (betekenis
REGEXP '[, ][a-zA-Z.\\-]{".$aantletters."}[, ]' OR betekenis
REGEXP '[, ][a-zA-Z.\\-]{".$aantletters."}$' OR betekenis
REGEXP '^[a-zA-Z.\\-]{".$aantletters."}[, ]' OR betekenis
REGEXP '^[a-zA-Z.\\-]{".$aantletters."}$')
ORDER BY omschrijving LIMIT 5"


Er wordt dus gezocht op 3x $zoekwoord% (wat men dus invoert); 1x normaal, 1x na omzetting van de 'y' in 'ij' en 1x na omzetting van de spaties in niks.
Met betekenis REGEXP 'expression' zoek ik op de lengte.

Echter dit gaat niet altijd goed! Een afkorting (bijv m.n.) wordt op deze manier gezien als 4 letters. Ook betekenissen waar een streepje of een spatie in zit, wordt met deze karakters meegeteld.

Ik heb mij laten vertellen dat REGEXP nog eens je systeem ernstig vertraagt.
Door diverse mensen wordt deze manier dus afgeraden.

Nu heb ik ook versie 2 gemaakt (niet live).
De woorden zitten dan als volgt in de database:

idOMSCHRIJVINGBETEKENISBETEKENIS2
1Deel van een huisdakdak
2Deel van een huiseetkamereetkamer
3Deel van een huiskamerkamer

4Deel van een huiskeukenkeuken
5Deel van een huisslaapkamerslaapkamer
6Deel van een huiszolderzolder
7Straathandelaarventerventer
8Wegpadpad
9Wegstraatstraat
10Wegzoekzoek


Betekenis2 is hetzelfde als Betekenis, maar dab zonder punten, spaties, streepjes, enz.
Hiervoor heb ik een scriptje geschreven dat alles netjes op het scherm weergeeft.
Alleen met deze manier snap ik niet hoe je moet LIMITen.
Hoe kan ik nou max. 5 resultaten weergeven, waar de bij elkaar horende omschrijvingen als één resultaat worden gezien?
Wie kan mij hier helpen en/of heeft hier een passend advies voor?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM woorden
WHERE (
   omschrijving LIKE '".$zoekwoord."%'
   OR omschrijving LIKE '".$zoekwoord2."%'
   OR omschrijving LIKE '".$zoekwoord3."%'
) AND (
  CHAR_LENGTH(betekenis) = ".$aantletters."
)
ORDER BY omschrijving LIMIT 5

:?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

woord ( woord_id, lengte, woord )
omschrijving ( omschrijving_id, omschrijving )
woord_omschrijving ( woord_id, omschrijving_id )

Lijkt me een stuk handiger, sneller, en gemakkelijker bij het ophalen van gegevens. Verder kun je logica als het omzetten van ij in y of andersom misschien beter in de code van je applicatie doen, en niet in je query. Het lijkt me niet zo'n ramp om een paar queries uit te voeren, als je zorgt dat je indexes een beetje kloppen.

Verwijderd

Topicstarter
-NMe- schreef op vrijdag 25 maart 2005 @ 20:19:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM woorden
WHERE (
   omschrijving LIKE '".$zoekwoord."%'
   OR omschrijving LIKE '".$zoekwoord2."%'
   OR omschrijving LIKE '".$zoekwoord3."%'
) AND (
  CHAR_LENGTH(betekenis) = ".$aantletters."
)
ORDER BY omschrijving LIMIT 5

:?
Maar, hoe denk je dan dat dit mogelijk is?
Kijk, in mijn eerstgenoemde situatie zitten de betekenissen komma-spatie gescheiden in de database in één row. Dus de totale lengte van de kolom Betekenis is niet de lengte waar men naar zoekt.

In de tweede situatie kan ik geen LIMIT 5 gebruiken.
Als het eerse woord al vijf betekenissen heeft, krijg je maar één resultaat te zien (met de eerste 5 betekenissen).
Verwijderd schreef op vrijdag 25 maart 2005 @ 20:44:
woord ( woord_id, lengte, woord )
omschrijving ( omschrijving_id, omschrijving )
woord_omschrijving ( woord_id, omschrijving_id )

Lijkt me een stuk handiger, sneller, en gemakkelijker bij het ophalen van gegevens. Verder kun je logica als het omzetten van ij in y of andersom misschien beter in de code van je applicatie doen, en niet in je query. Het lijkt me niet zo'n ramp om een paar queries uit te voeren, als je zorgt dat je indexes een beetje kloppen.
Dus je bedoelt dan dat je 3 tabellen maakt en deze aan elkaar koppelt?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Dus je bedoelt dan dat je 3 tabellen maakt en deze aan elkaar koppelt?
Dat bedoelt hij ja. Als je dat doet, dan kun je mijn query ook toepassen. Dat werkt een stuk lekkerder dan dit. :P

Ik had je post niet goed gelezen, dus ik zag niet dat je één kolom gebruikte voor meerdere entries. Dat is gewoon sowieso nooit goed. Je hebt toch een database? Dan kun je toch ook andere oplossingen verzinnen die beter zijn dan het gebruik van één kolom? Zoek maar eens wat op over normaliseren. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 01-03 18:17
Kijk, in mijn eerstgenoemde situatie zitten de betekenissen komma-spatie gescheiden in de database in één row.
Als dit zo is, is je datamodel fout :) Het is inderdaad veel netter (en waarschijnlijk ook sneller) als je het model van Cheatah gebruikt. De manier waarop je nu werkt is erg omslachtig en maakt geen gebruik van de mogelijkheden van een relationele database...

offtopic:
Waarom staat er eigenlijk PHP in de topictitel :? Het gaat toch over SQL?

Verwijderd

Topicstarter
ludo schreef op vrijdag 25 maart 2005 @ 21:34:
[...]
Als dit zo is, is je datamodel fout :) Het is inderdaad veel netter (en waarschijnlijk ook sneller) als je het model van Cheatah gebruikt. De manier waarop je nu werkt is erg omslachtig en maakt geen gebruik van de mogelijkheden van een relationele database...
Oke heel erg bedankt :) ! Ik begrijp nu hoe ik het moet gaan aanpakken.
Ik ga het eerst in het klein bewerkstelligen en als dat gelukt is, bouw ik de rest eromheen.
offtopic:
Waarom staat er eigenlijk PHP in de topictitel :? Het gaat toch over SQL?
... Ja, foutje van mij, ik dacht dat het een algemenere titel moest hebben.
Pagina: 1