Avatar billede hkb-x Nybegynder
17. februar 2006 - 22:50 Der er 12 kommentarer og
1 løsning

smarte forespørgsel

Jeg er ved at lave en søgefunktion på min side... men vil gerne lave den lidt smart...

Det skal være såddan at når man søger i artikler så hiver den ud af databasen efter denne pririartering:

1. Artikler hvor søgeordet indgår i både tekst og titel
2. Artikler hvor søgeordet indgår i titlen
2. Artikler hvor søgeordet indgår i teksen

Men hvordan gør man det?
Avatar billede whatever Nybegynder
17. februar 2006 - 23:25 #1
Okay, sæt dig godt på stolen så du ikke falder ned, når du ser det sql der nu:

$query = // Skal indeholde det brugeren har indtastet
$res = mysql_query("
                    SET
                        @priority = 0;
                    SELECT
                        titel,
                        @priority AS priority
                    FROM
                        artikler
                    WHERE
                        CASE
                            WHEN (titel LIKE '%".$query."%' AND tekst LIKE '%".$query."%')
                                THEN @priority := 1
                            WHEN (titel LIKE '%".$query."%' AND tekst NOT LIKE '%".$query."%')
                                THEN @priority := 2
                            WHEN (tekst LIKE '%".$query."%' AND titel NOT LIKE '%".$query."%')
                                THEN @priority := 3
                        ELSE
                            @priority := 0
                        END
                    ORDER BY
                        @priority
                ");
// Det fundne data løbes igennem med en alm. while.
Avatar billede whatever Nybegynder
17. februar 2006 - 23:39 #2
En lille forklaring:

@priority er en variabel i query'en. Den defineres i SET-delen.

I WHERE-delen har jeg benyttet en CASE. Den svarer til switch kontrolstrukturen som du kender i php. Findes søgeordet både i titel og tekst sættes @priority til 1, indgår søgeordet kun i titlen sættes @priority til 2, og endelig sættes @priority til 3 hvis søgeordet kun indgår i teksten.

Til sidst sorteres de fundne artikler efter @priority, så de kommer ud i den rigtige rækkefølge.
Avatar billede hkb-x Nybegynder
17. februar 2006 - 23:57 #3
nice... og jeg kan bare smide en limit x,y i enden?
Avatar billede whatever Nybegynder
18. februar 2006 - 00:04 #4
Ja, du indsætter limit'en som normalt efter order by delen.
Avatar billede hkb-x Nybegynder
18. februar 2006 - 00:10 #5
hmmm ... den kan ikke rigtigt lide den... :S... du får den lige:

Kunne ikke udføre:  SET @priority = 0; SELECT navndk, @priority AS priority FROM Produkter WHERE CASE WHEN (navntdk LIKE '%hummel%' AND textdk LIKE '%hummel%') THEN @priority := 1 WHEN (navndk LIKE '%hummel%' AND textdk NOT LIKE '%hummel%') THEN @priority := 2 WHEN (navndk LIKE '%hummel%' AND textdk NOT LIKE '%hummel%') THEN @priority := 3 ELSE @priority := 0 END ORDER BY @priority
Fejlen er: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; SELECT navndk, @priority AS prio' at line 2
Avatar billede whatever Nybegynder
18. februar 2006 - 00:20 #6
Okay, jeg havde kun testet den i et mysql admin tool. Følgende burde virke:

$query = "hummel";
mysql_query("SET @priority = 0");
$res = mysql_query("
                    SELECT
                        navndk,
                        @priority AS priority
                    FROM
                        artikler
                    WHERE
                        CASE
                            WHEN (navndk LIKE '%".$query."%' AND textdk LIKE '%".$query."%')
                                THEN @priority := 1
                            WHEN (navndk LIKE '%".$query."%' AND textdk NOT LIKE '%".$query."%')
                                THEN @priority := 2
                            WHEN (textdk LIKE '%".$query."%' AND navndk NOT LIKE '%".$query."%')
                                THEN @priority := 3
                        ELSE
                            @priority := 0
                        END
                    ORDER BY
                        @priority
                ");

Selve SET-delen skal tilesyneladende, når den kører igennem php, skilles ud sin egen mysql_query.
Avatar billede hkb-x Nybegynder
18. februar 2006 - 00:26 #7
nu kom der sgu noget... nu flår den hele databasen ud... :S... 2 sekunder så kigger jeg lige på det...
Avatar billede hkb-x Nybegynder
18. februar 2006 - 00:31 #8
soræ... min fejl.... men den sorterer ikke rigtigt...

vil gerne have alle dem hvor søgeordet står i både text og tittel først...
Avatar billede hkb-x Nybegynder
18. februar 2006 - 00:40 #9
har prøvet at hive priority ud som en værdi men den er tom...
Avatar billede whatever Nybegynder
18. februar 2006 - 00:47 #10
Jeg kan godt se problemet med sorteringen. Men det undrer mig lidt at priority er tom. Hvordan ser din kode ud?
Avatar billede hkb-x Nybegynder
18. februar 2006 - 01:01 #11
nej vent... det er mig der er en idiot... manglede et y i @priority... nu virker det perfekt... tak...

skriv svar for point...
Avatar billede whatever Nybegynder
18. februar 2006 - 15:32 #12
Et svar.

Fik du sorteringen til at virke?
Avatar billede hkb-x Nybegynder
20. februar 2006 - 17:33 #13
yep... virker perfekt...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester