Hoi,

Een tijdje geleden had ik een topic geopent waarin ik vroeg of er een manier is om de relevantie te bepalen aan de relevantie die mysql terug geeft én de datum. (dit met een FULL TEXT SEARCH dus).

Dit is dus de betreffende zoek sql
<?php
$s_sql = "SELECT *, MATCH(`titel`) AGAINST ('>".$s."') AS `relevantie` FROM nieuws WHERE MATCH (titel,korttekst,tekst) AGAINST ('".$s."' IN BOOLEAN MODE) ORDER BY datum DESC, relevantie DESC";
?>

Nu heb ik nog eens goed en hard lopen/zitten denken. En kwam ik tot het volgende idee.
Ik wil laten sorteren op de relevantie.

En hoe wil ik die relevantie nu berekenen?
Deel 1: MySQL retourneerd een relevatie...

Deel 2 De datum is als timestamp, dus een 10 cijferig getal... Als ik dit getal deel door de huidige timestamp... dan komt er bij een nieuw artikel een hoger getal uit dan bij een ouder... Maar omdat ik de relevantie belangrijker vindt dan de datum doe ik het getal wat uikomt ( >= 1 ) * 0.75.

Vervolgens tel ik de relevantie welke is berekend bij Deel 1 + Deel 2 en hier moet deze dan op gaan sorteren.


Echter is dit een vrij ingewikkeld iets... en ik weet hoe je dingen kan selecteren uit de database, er inzetten, een beetje laten zoeken verwijderen en al dat... maar dit is toch nog iets te ingewikkeld, vandaar dat ik hier hulp zoek. Ik denk dat dit niet alleen voor mij, maar ook voor andere php'ers interessant kan zijn...

Alvast bedankt,
Arian
Waarom gebruik je een timestamp wanneer je met een DATETIME veel meer mogelijkheden hebt? Zie bv. hoofdstuk 12.5 van de MySQL-handleiding. En mocht je toch echt met een timestamp willen werken, MySQL kan van een DATETIME zo weer een timestamp maken.

Maar dan nu even terug naar de vraag: Wat vind je zo ingewikkeld aan de berekening? Je hebt alles al op een rijtje staan, nu nog even in de SQL zetten en klaar ben je.

Tip: Schrijf de SQL uit over meerdere regels om het overzicht te houden. En natuurlijk af en toe inspringen.
Maar zou je mij een beetje op weg willen helpen want ik snap nog niet zoveel van die mysql functies omdat ik hun site nog niet helemaal door heb :S
Wat snap je dan niet aan de documentatie van MySQL? Met de volgende query kun je bv. berekenen hoe oud een artikel is (in dagen):

SELECT
  DATEDIFF(CURDATE(), datum) AS verschil
FROM
  tabelnaam

De kolomnaam 'datum' bevat de datum, duhhh. Uiteraard kun je deze berekening ook onderdeel laten zijn van een grotere berekening.

En nu mag je zelf weer even aan de slag.
Aah, ik snap het nu wel al een beetje...
Maar
DATEDIFF(CURDATE(), datum) AS verschil,
geeft een hoger getal dus als het ouder wordt, en
MATCH(titel) AGAINST('zoekwoord') AS titel_relevantie,
geeft een lager getal als het minder relevant wordt.

Hoe kan ik dan berekenen dat een ouder bericht een lager getal krijgt dan een nieuwer ?


:O oke (Y) tnx.

Ik snap hem.
Maar nu wil ik verder rekenen. Ik heb ondertussen een getal gemaakt bij de datum, titel, de kortte tekst (korttekst), en het lange artikel (tekst).

dus dan denk ik, dat doe ik zo:
<?php
$s_sql = "
SELECT
DATEDIFF(datum, CURDATE()) AS verschil,
MATCH(titel) AGAINST('".$s."' * 2) AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."' * 0.5) AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."' * 1.25) AS kort_relevantie,
((verschil / 0.5) * titel_relevantie * tekst_relevantie * kort_relevantie) AS relevantie
FROM nieuws
ORDER BY relevantie DESC";
?>

Maar helaas, werkt niet... hij zegt hier met mysql_error(): Onbekende kolom 'verschil' in field list.

dus dan probeer ik het zo:

<?php
$s_sql = "
SELECT
DATEDIFF(datum, CURDATE()) AS verschil,
MATCH(titel) AGAINST('".$s."' * 2) AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."' * 0.5) AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."' * 1.25) AS kort_relevantie
FROM nieuws
ORDER BY ((verschil / 0.5) * titel_relevantie * tekst_relevantie * kort_relevantie) DESC";
?>

Maar helaas werkt ook niet... Hier zegt hij met mysql_error(): Onbekende kolom 'verschil' in order clause

Hoe komt dit nou ?? :S
Volgens mij kun je een alias niet in de ORDER BY gebruiken.
Klaasjan Boven schreef op 10.10.2006 20:52
Volgens mij kun je een alias niet in de ORDER BY gebruiken.
Dat is volgens mij ook het geval. De berekening kun je echter wel in de ORDER BY opnemen, dat is geen enkel probleem.
Oftewel probeer eens.

<?php
$s_sql = "
SELECT
DATEDIFF(datum, CURDATE()) AS verschil,
MATCH(titel) AGAINST('".$s."' * 2) AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."' * 0.5) AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."' * 1.25) AS kort_relevantie
FROM nieuws
ORDER BY ((DATEDIFF(datum, CURDATE()) / 0.5) * titel_relevantie * tekst_relevantie * kort_relevantie) DESC";
?>
@ klaas jan... je bedoelt dus dat je bv niet op 'verschil' kan sorteren?
volgens mij wel. Want hij deed het wel... ;-) als ik de tweede situatie neem en dan ORDER BY verschil doe

Reageren