WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   väldigt komplicerad mySQL fråga! lite hjälp (https://www.wn.se/forum/showthread.php?t=1039869)

youheardit 2010-01-06 01:46

väldigt komplicerad mySQL fråga! lite hjälp
 
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!

NeoTech 2010-01-06 01:49

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>";

KarlRoos 2010-01-08 18:27

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);

Blir väldigt tungt då den söker på varje ord, men borde funka (OTESTAT!)

Lycka till.

Conny Westh 2010-01-09 03:08

Citat:

Ursprungligen postat av youheardit (Inlägg 20337884)
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!

Kan du berätta vad du ska ha taggarna till?

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')
)

I ovanstående kod kommer alla artiklar upp som har en koppling till endera 'Gurka', 'Melon' eller '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.


Alla tider är GMT +2. Klockan är nu 11:14.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson