WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL/PHP Tagg-system (https://www.wn.se/forum/showthread.php?t=1059061)

jejje.net 2013-09-06 12:21

MySQL/PHP Tagg-system
 
Hej alla på WN!

Jag försöker att bygga ett tagg-system liknande Wordpress. Men jag förstår inte riktigt hur jag ska formulera MySQL syntaxen, och skulle uppskatta lite hjälp på den fronten. Jag har googlat en del, men haft svårt att förstå koden och därför inte kunnat applicera det på mitt egna script. Jag har en databas med 3 tabeller:

imgs - Min tabell med bilder.
id_imgs - Primarykey
title - Titel för bild

tags - Tabell med taggarna
id_tags - Primarykey
safe_tag - Taggnamnet för url-friendly
tag_name - Riktiga namnet på taggen

tags_ref - Tabell med referens över taggar och bild
id_tags_ref - Primarykey (nog överflödig, men känner ändå att kan va bra att ha)
tag_id - ID nummer för vilken tagg ifrån 'tags'-tabellen med foreignkey
row_id - ID nummer för vilken bild 'imgs'-tabellen den tillhör

Jag har sett olika sätt att göra det på, men tror att det är någon av de alla olika JOIN jag ska använda. Men när jag läser igenom andras syntax så blir jag bara förvirrad. Någon som kan hjälpa mig hur min query ska se ut, och försöka förklara den så jag förstår?

Har nu suttit i flera dagar och googlat, och provat utan att få något vettigt resultat. Har lite tidigare erfarenhet av PHP/MySQL men aldrig egentligen använt mig av JOINS eller one-to-many-relationship.

ANttila 2013-09-06 12:39

Vad är det för resultat du vill ha?

Taggar till en specifik bild?
Alla bilder med tillhörande taggar?
Bilder som har en specifik tagg?

jejje.net 2013-09-06 12:51

Citat:

Ursprungligen postat av ANttila (Inlägg 20476898)
Vad är det för resultat du vill ha?

Taggar till en specifik bild?
Alla bilder med tillhörande taggar?
Bilder som har en specifik tagg?

Jag vill få fram alla bilder med te.x. taggen "katter". Men kommer också behöva visa alla taggar för en specifik bild, men framförallt är det det visa alla bilder av en tagg. Får jag förståelse för hur jag ska använda syntaxen så borde detta falla på plats.

ANttila 2013-09-06 13:10

Kod:

SELECT imgs.title
        FROM imgs
        LEFT JOIN tags_ref
                ON imgs.id = tags_ref.row_id
        LEFT JOIN tags
                ON tags_ref.tag_id = tags.id
        WHERE tags.tag_name = "katt"

Eller utan joins:

Kod:

SELECT imgs.title
        FROM tags, tags_ref, imgs
        WHERE tags_ref.tag_id = tags.id AND imgs.id = tags_ref.row_id AND tags.tag_name = "katt";

Du måste se till att länka ihop tabellerna. (Så dom har en relation till varandra)

Någon pedagogisk förklaring kan jag inte bidra med tyvärr, då jag är sämst på att förklara hur det fungerar.

EDIT:
Läs om hur LEFT JOIN fungerar, så borde du förstå hur den skapar relationer

Om du är van vid att göra dessa utan joins så kan du jämföra de två versionerna jag skapade och kanske få bättre förståelse.

jejje.net 2013-09-06 13:25

Sjukt nice, körde det MySQL Workbench och fick fram rätt resultat. Nu när jag har en fungerande kod kan jag utgå ifrån denna för att få ett mycket bättre begrepp om hur JOINS fungerar.

Det jag har haft störst problem med är i vilken ordning de ska slås ihop. Du anar inte hur tacksam jag är - suttit så länge för att försöka få det här att gå ihop!

Jag har endast testat det övre exemplet - är det någon fördel/nackdel att använda joins över det andra?

ANttila 2013-09-06 13:32

Jag tror att köra allt i en WHERE är en utdaterad metod.

I princip så börjar du med FROM, från antingen imgs eller tags
Sen gör ju en LEFT JOIN med den mellanliggande tabellen tags_ref.
Slutar med LEFT JOIN på det som blev över från steg 1.

Det fungerar åt båda hållen.

Vad som är bäst vet jag inte.

jejje.net 2013-09-06 13:57

Okay, tackar så mycket! Håller nu på för fullt att bygga klart mitt tag-system och det går som på räls just nu. Kommer nog att använda denna post som referens punkt för mina näst kommande joins. ;)


Alla tider är GMT +2. Klockan är nu 10:20.

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