FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Har WN som tidsfördriv
|
Tjenare!
Sitter nu och försöker skriva en fråga, har allt i huvudet men kan inte riktigt få det till en fråga i mySQL, har nu suttit i någon vecka med denna kluriga fråga och hoppas någon här inne kan hjälpa lite? jag har en db-tabell med låt oss säga artiklar, eller iaf långa texter. Sedan har jag en tabell med namn (personer) och även en annan tabell med taggar till namnen (med 3 kolumner, ena id, vanligt auto_increment, sedan person_id, IDt på personen i tabellen personer, och till sist taggen) Nu vill jag att med helst en fråga leta upp om namnen eller taggarna existerar i texten och isåfall visa vilka taggar som existerar i texten... har testat med allt möjligt, regexp (visar ju inte vilka taggar, bara om dem finns) LIKE är kanske ingen idé... mm! Tacksam för hjälp! ![]() Med vänliga hälsningar! //Philip Andersson! |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
Låter som att Joins är enklaste sättet här.. finns det en referens tabell som säger hur artiklarna kopplas till personerna med?!
typ "select <whatever> from artiklar a left join personer p on a.person_id = a.person_id left join taggar t on p.person_id = t.person_id where <filtrera med like eller regexp o vikta efter behovet>"; |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Har WN som tidsfördriv
|
Kod:
$sql = 'SELECT taggar.tagg, person.namn FROM `taggar` JOIN `person` ON taggar.person_id = person.person_id WHERE'; $first = true; foreach(explode(' ',strip_tags($content)) as $word) { if(!$first) $sql .= ' OR'; $first = false; $sql .= ' MATCH(taggar.tagg) AGAINST ("%'.$word.'%")'; } $result = mysql_query($sql); Lycka till. |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Klarade millennium-buggen
|
Citat:
Det beror på vad du ska ha taggarna till, är det en typ av koppling mellan en "tagg" (eg särskilda nyckelord) och en artikel du vill ha för att snabbt hitta till en specifik artikel. I så fall bör man ha en uppsättning tabeller ungefär så här: Tabell: ARTIKEL - ArtikelId (Primärnyckel) - ArtikelText (String) Tabell: PERSON - PersonId (Primärnyckel) - Namn (String) Tabell: TAG - TagId (Primärnyckel) Tabell: ARTIKEL_TAG - ArtikelId (Primärnyckel) (Främmande nyckel till Tabell: ARTIKEL) - TagId (Primärnyckel) (Främmande nyckel till Tabell: TAG) Om du sen ska få fram en lista på alla artiklar som innehåller taggen "Gurka" så skriver du så här i SQL: Kod:
SELECT * FROM Artikel a WHERE a.ArtikelId IN (SELECT t.ArtikelId FROM Artikel_Tag t WHERE t.TagId IN ('Gurka', 'Melon', 'Banan') ) Fördelen med detta sätt är att det blir blixtsnabba sökningar. Använder du fritextsökning så kommer SQL tvingas göra en tablescan (dvs gå igenom varenda rad i hela databasen för varje sökning) medan den kod jag presenterade ovan endast gör en effektiv indexsökning och därmed blir den blixtsnabb. Senast redigerad av Conny Westh den 2010-01-09 klockan 03:20 |
||
![]() |
![]() |
Svara |
|
|