Avatar billede kongknabe Nybegynder
28. april 2009 - 12:39 Der er 14 kommentarer

PHP, MySQL - avanceret sortering og gruppering af resultater?

Hejsa.

Sidder og roder med en søge funktion og har i den forbindelse et par PHP/MySQL spørgsmål jeg håber at kunne få hjælp til herinde :)

Spørgsmål 1) Hvis man laver en søgning der hedder: WHERE id LIKE '%$search_query%' - Hvordan sørger man så for at resultaterne bliver sorteret efter relevans - eller bedste match?

Det jeg egentlig gerne vil er at sortere dem efter hvor tidligt i overskriften der er et match med search_queryen, så hvis jeg f.eks. har to forskellige overskrifter der ser ud som følger:

a) Dette er en overskrift
b) Overskrift på artikel

- Og laver en søgning WHERE overskrift LIKE '%skr' så vil den matche på begge overskrifter oven over, men jeg vil gerne have resultat "b" til at være det der kommer først, også selvom det evt. har en ældre oprettelses dato end "a"

Spørgsmål 2)

Lad os blive i analogien med artikler på f.eks. en blog. Jeg vil nu lave en søgning i artikler hvor den eksempelvis søger i artikkel overskrift og artikkel kategori. Måske har jeg en kategori der hedder "webdesign", og en anden kategori der hedder "grafisk design". Jeg laver nu en søgning på ordet "design" og får alle artikler i de to kategorier.

Det jeg så gerne vil nu er at grupere dem, i dette tilfælde i to grupper - så den kun viser resultatet "Webdesign", og "Grafisk design" en gang hver.

Så overordnet handler det om sortering og gruppering - 100 point for hvertspørgsmål :)
Avatar billede jakobdo Ekspert
28. april 2009 - 12:50 #1
Du skal ikke anvende LIKE, du bør anvende:
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
Avatar billede acore Ekspert
28. april 2009 - 12:58 #2
Ang spm. 2:
Hvis du vil gruppere bliver det noget i stil med:

SELECT kategori, count(kategori) AS antal FROM blog WHERE xxx GROUP BY kategori

Så får du et svar med én linie for hver kategori og optalt antallet, så du kan lave et svar i stil med:

Søgeresultat:
Webdesign (8 artikler)
Grafisk design (2 artikler)

hvor hver kategori fx kan være et link, man kan klikke videre på.
Avatar billede acore Ekspert
28. april 2009 - 12:59 #3
Ang spm. 2:
Hvis du vil gruppere bliver det noget i stil med:

SELECT kategori, count(kategori) AS antal FROM blog WHERE xxx GROUP BY kategori

Så får du et svar med én linie for hver kategori og optalt antallet, så du kan lave et svar i stil med:

Søgeresultat:
Webdesign (8 artikler)
Grafisk design (2 artikler)

hvor hver kategori fx kan være et link, man kan klikke videre på.
Avatar billede kongknabe Nybegynder
28. april 2009 - 13:05 #4
@jacobdo

Takker.. det vil jeg lige kigge på :)

@acore

Takker, det er netop det jeg søger, men problemet er at søgeresultatet både kan matche f.eks. en kategori eller måske et tag... Så det jeg egentlig gerne vil er at sortere alle resultater på f.eks. kategori som du skriver ovenfor, men samtidig sortere alle resultater på f.eks. tags på samme måde.... Noget ala:

GROUP BY kategori OR tag (Alt efter hvad der matches på).
Avatar billede acore Ekspert
28. april 2009 - 15:59 #5
Det med tag forstår jeg ikke helt. Men det kan da sikkert lade sig gøre.

Er det to helt forskellige søgninger (i forskellige felter og/eller tabeller), som du vil kombinere? Kan du ikke forklare lidt mere om hvordan tabellen/tabellerne ser ud og hvordan du gerne vil se resultatet?
Avatar billede kongknabe Nybegynder
28. april 2009 - 16:09 #6
Skal lige prøve at forklare bedre så :)

Forestil dig at jeg har to artikler på min blog:

a)

- Artikel overskrift: "Se her...! fantastisk tilbud"
- Artikkel tags: "Webdesign", "Programering", "Arbejde"

b)

- Artikel overskrift: "Her en anden overskrift"
- Artikel tags: "SEO", "Google", "Søgemaskiner"

Jeg laver så eksempelvis en søgning på "se" og det vil jo så matche både "se" i a) "SE her..." og "se" i b) "SEo".

Det jeg så gerne vil er at grupere alle resultater der matcher et eller andet i en overskrift sammen, og alle resultater der matcher et eller andet på samme tag, så resultatet af min søgning kommer til at se ud som følger:

Resultater:

1) Overskrift (1 hit)
2) Tags - SEO (1 hit)
Avatar billede dkfire Nybegynder
28. april 2009 - 16:25 #7
Nu har du vel ikke ladt dine tags i én celle ?

Dine tags ligger vel i en anden tabel end din artikel ??
Ellers bør du se at få normaliseret dine tabeller.
Avatar billede kongknabe Nybegynder
28. april 2009 - 16:39 #8
@dkfire

Nu er det her bare et eksempel for at gøre det overskueligt og lettere at forklare hvad jeg vil.. Men jo, mine tags i det her eksempel ligger i en anden tabel end artiklerne :)

Jeg kunne selvfølgelig bare lave to separate opslag i databasen men vill egerne forsøge at skrive det hele sammen til en sætning (Men det er måske slet ikke nogen fordel?)
Avatar billede dkfire Nybegynder
28. april 2009 - 19:19 #9
Ok, jeg skulle bare lige tjekke, folk herinde kan jo finde på så meget ;-)

Jeg ville nok lave to sql søgninger. Da de to resultater fra dem ikke kan forbindes til hinanden, bliver det meget svært (umuligt) at lave en samlet sql søgning.
Avatar billede kongknabe Nybegynder
30. april 2009 - 09:47 #10
Har nu forsøgt mig med en fullstext search som jacobdo foreslog ovenover, men kan ikke få det til at virke!?

Benytter følgende kode og har oprettet en tabel med et fulltext index, men den finder ingenting når jeg forsøger!?

<?php
    MySQL_connect("127.0.0.1", "root", "");
    MySQL_select_db("FULLTEXT");
    $sql = "
        SELECT * FROM articles
        WHERE MATCH(title, body) AGAINST ('overskrift')
    ";
   
    $result = MySQL_query($sql);
?>



<table>
<tr><td>SCORE</td><td>TITLE</td><td>ID#</td></tr>
<?php
       
        while($data = MySQL_fetch_array($result)) {
           
            echo "<tr><td>{$data['title']}</td>";
            echo "<td>{$data['body']}</td></tr>";
        }
        echo "</table>";
   
?>
Avatar billede jakobdo Ekspert
30. april 2009 - 10:23 #11
Prøv følgende sql:

SELECT * FROM articles WHERE MATCH(title, body) AGAINST ('overskrift*')
Avatar billede kongknabe Nybegynder
30. april 2009 - 10:26 #12
Det gør ikke umiddelbart nogen forskel!?
Avatar billede jakobdo Ekspert
30. april 2009 - 10:31 #13
Det gjorde det hos mig, da jeg søgte lokalt.
Og du har teksten overskrift stående i enten title eller body felterne ?
Avatar billede kongknabe Nybegynder
30. april 2009 - 10:39 #14
Ja, har teksten "overskrift" stående flere forskellige steder.. Mystisk... Her et screenshot af den tabel jeg prøver at søge i.. Ser det ikke rigtigt ud?

http://www.flickr.com/photos/38409347@N00/3487650259/sizes/o/
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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