---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate
Hoewel volgens mij if statements en cases erg fout zijn in sql moet het met LENGTH() INSTR() en IF() wel lukken.
Je stelt dus voor om alles in een grote query te dumpen? Dat is wellicht een goed idee; de vraag is of de kwaliteit van de resultaten een beetje hoog blijft. Ik ga het iig proberen.Gert schreef op 11 januari 2003 @ 21:05:
Iets van als lengte gevonden = lengte gezoch dan een waarde 3, als begint met gezocht dan waar 2, en anders als gevonden moet het wel ergens verstopt zitten en dan waarde 1 en dan soorten op waarde desc.
Hoewel volgens mij if statements en cases erg fout zijn in sql moet het met LENGTH() INSTR() en IF() wel lukken.
Ik maak gebruik van indexes; maar ik zie zo snel even niet hoe ik die kan gebruiken om een snelheidswinst te krijgen? Waar ik wel aan heb zitten denken is het meegeven van alle indexes die uit de 'nieuwe' querie rollen aan de queries 1, 2 en 3Verwijderd schreef op 11 January 2003 @ 21:13:
Heb je al indexes gebruikt....?
---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate
Dus iets ala:
1
2
3
4
5
6
7
8
| create temporary table blaat ( -- vergeet niet een stel indices mee te geven voor sneller sorteren ); insert into blaat SELECT ..., waarde_om_aan_te_geven_dat_je_volledig_zocht from je_zoek_tabel where ...; insert into blaat SELECT ..., waarde_om_aan_te_geven_dat_je_op_begin_zocht from je_zoek_tabel where ...; insert into blaat SELECT ..., waarde_om_aan_te_geven_dat_je_%woord%_zocht from je_zoek_tabel where ...; select ... from blaat ORDER by laatste_veldje_voor_de_zoek_opties, zoekscore; |
etc
---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate
Het probleem wat ik hier echter bij heb is dat de resultaten niet goed worden gesorteerd. Het wordt momenteel op alfabet gerangschikt, maar wat ik eigenlijk wil is dat de exacte match bovenaan komt te staan; en daaronder de woorden die beginnen met het gezochte woord; en daaronder de rest. Is dit te doen met een soort van Reguliere Expressie aan mySQL's kant? Ik heb al zitten proberen het met WHERE MATCH te doen; maar dat lukt niet.
[ Voor 5% gewijzigd door Spider.007 op 12-01-2003 23:12 ]
---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate
oid kan misschien nuttig zijn?
Zou kunnen dat mysql dit "WHEN" of iets van CASE noemt.
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| select woord as Match, cast(1 as integer) as Sortering, from mytable where mytable.woord='woord' union all select woord as Match, cast(2 as integer) as Sortering from mytable where mytable.woord 'like '%woord%" and mytable.woord<>'woord' order by Sortering, Match |
//edit
wat veranderingen aan query
[ Voor 80% gewijzigd door Verwijderd op 13-01-2003 01:56 ]
Verwijderd
Dit ziet er uit als een hele goede oplossingACM schreef op 13 January 2003 @ 01:43:
select ... (IF woordveld = 'woord' THEN 1 ELSE IF woordveld LIKE 'woord%' THEN 2 ELSE IF woordveld LIKE '%woord%' THEN 3 END IF) as sorter from ... where ... ORDER BY sorter, woordveld
oid kan misschien nuttig zijn?
Zou kunnen dat mysql dit "WHEN" of iets van CASE noemt.
---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate
Spider.007 schreef op 12 januari 2003 @ 23:10:
Omdat een tijdelijke tabel te weinig tijdwinst op leverde heb ik het nu zo opgelost dat ik eigenlijk alleen (een gewijzigde) query drie uitvoer. Wat ik nu doe is namelijk een select op LIKE "%woord%"; hier komen dus de juiste resultaten uit naar voren. (deze neemt 0.82 sec in beslag; al een grote verbetering ten opzichte van de eerste tijden.)
Even een opmerking tussendoor gooiend:
LIKE '%woord%' zal _NIET_ gebruik maken van je indexen en is bere! traag!. Dit omdat %woord niet als constante gezien/geoptimaliseerd kan worden. Zie hiervoor de MySQL manual bij LIKE
1
2
3
4
5
6
7
8
9
| SELECT DISTINCT WoordNr,(CASE WHEN Woord = "GoT" THEN 1 WHEN Woord LIKE "GoT%" THEN 2 WHEN When LIKE "%GoT%" THEN 3 END) AS RANK FROM Woorden WHERE Woord LIKE "%GoT%" ORDER BY RANK, Woord LIMIT 250; |
documentatie van een CASE
Deze query duurt 0.850119 sec. op 60.000 woorden; op een VIA C3 533
Hardstikke bedankt allemaal voor het meedenken
---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate