Avatar billede zurekk Nybegynder
17. januar 2008 - 20:28 Der er 22 kommentarer og
1 løsning

Hive række og tags ud på samme tid?

Hej Eksperter,

Lige nu har jeg 2 tabeller, én til indhold og én til tags.

Mit spørgsmål er så, hvordan hiver jeg flere tags ud i samme query som jeg henter selve indholdet tag'sne er forbundet til..ud?

Er det noget med at jeg henter tag'sne og så LEFT JOIN'er indholdet, eller kan det gøres anderledes?
Det skal gerne være så query resultatet ikke bliver for rodet, da det skal gøres flere gange efter hinanden(listing), og jeg skal kunne linke de forskellige tags og indhold sammen : )

På forhånd tak.
Avatar billede jakobdo Ekspert
17. januar 2008 - 20:31 #1
Du burde kunne gøre det med en INNER JOIN.
Avatar billede zurekk Nybegynder
17. januar 2008 - 20:33 #2
Undersøger jeg lige og vender tilbage.
Avatar billede jakobdo Ekspert
17. januar 2008 - 20:41 #3
Du kunne også vise hvad felterne hedder i din tabeller, så kan jeg måske komme med et bud på en SQL.
Avatar billede zurekk Nybegynder
17. januar 2008 - 20:44 #4
Hmm.. well.. det var egentlig hvad jeg ville undgå.
Når der er 2 eller flere tags, returnerer den nemlig 2 ens rækker med tag'et inkluderet.

Eksempel:

tb1
id#name
1#hej

tags
tb1_id#tag
1#numsegøjl
1#ebernogetfis

Returnerer dette:
id#name#tb1_id#tag
1#hej#1#numsegøjl
1#hej#1#ebernogetfis

Hvis vi så siger er der er 5-10 tags pr. "item", og jeg henter 25 items ud, så bliver det hurtigt meget rodet, og jeg aner ikke hvordan jeg skal håndtere det =/
Avatar billede jakobdo Ekspert
17. januar 2008 - 21:11 #5
Du kan enten lave en stor SQL hvor du bruger INNER JOIN og så lave noget ORDER BY tb1.id
Eller du kunne lave:

sql 1 som trækker 25 rækker ud fra tb1.
For hver række i tb1 trækker du tags ud, hvor tb1.id = tb1_id.
Avatar billede zurekk Nybegynder
17. januar 2008 - 21:15 #6
"sql 1 som trækker 25 rækker ud fra tb1.
For hver række i tb1 trækker du tags ud, hvor tb1.id = tb1_id."

Det er udelukket, det vil blive til 26+ queries, det er ALT for meget.

Og når du siger "stor SQL", mener du så en stor query udtrækning, eller et stort resultat?
Altså som jeg viste i eksemplet 20:44:02?
Avatar billede jakobdo Ekspert
17. januar 2008 - 21:19 #7
Jeg mener det bliver en "lang" sql, og ikke blot select id from table.
Men selvom du siger 26 queries, det er jo det samme som der sker med INNER JOIN, der laver den bare de 25 queries internt.
Avatar billede zurekk Nybegynder
17. januar 2008 - 21:23 #8
Jep, men det skulle(så vidt jeg ved) være lettere på serveren.

Det skal bruges på et site som meget muligt vil få mange besøgende.
Derfor vil jeg gøre siden så let som muligt.
Og antallet af seperate queries skulle have stor betydning på belastning af MySQL-serveren.
Avatar billede zurekk Nybegynder
17. januar 2008 - 22:04 #9
Og så er det desuden også hurtigere i længden at hente det hele ud på én gang, end at hente det ud i loopet(har lige lavet en lille test).
Avatar billede zurekk Nybegynder
17. januar 2008 - 22:06 #10
Du er sikkert smuttet i seng nu, så hvis du vender tilbage i morgen, kunne jeg stadig godt tænke mig et bud på en løsning :-)
Måske dit '"lang" sql, og ikke blot select id from table.' forslag :)?
Avatar billede zurekk Nybegynder
18. januar 2008 - 19:17 #11
Intet?
Avatar billede zurekk Nybegynder
19. januar 2008 - 13:54 #12
Jamen så tror jeg da bare at jeg lukker : )
Avatar billede jakobdo Ekspert
19. januar 2008 - 18:17 #13
Sorry, har haft en travl weekend...
Avatar billede zurekk Nybegynder
19. januar 2008 - 21:28 #14
Hvis du skulle komme på en løsning, smider du den bare, så kan jeg altid åbne et nyt spørgsmål med point : )

Og intet at undskylde for ^^
Avatar billede jakobdo Ekspert
19. januar 2008 - 21:40 #15
Jeg ville lave:

SELECT tb1.name, tags.tag FROM tb1 INNER JOIN tags ON tb1.id = tags.tb1.id ORDER BY tb1.id

Ligesom du har skrevet tidligere.
Og så skal du lave noget php kode, som tjekker om tb1.id skifter, altså f.eks. fra 1 til 2, fra 2 til 3 osv...

Et skift = ny række i tabellen.
Avatar billede zurekk Nybegynder
20. januar 2008 - 11:49 #16
Dvs. et loop som kører alle rækkerne, og så inde i det loop, endnu et loop som kører indtil der ikke er flere tags, og så videre til næste række?
Avatar billede jakobdo Ekspert
20. januar 2008 - 17:28 #17
Nej, du skal nøjes med et loop.
Avatar billede zurekk Nybegynder
20. januar 2008 - 18:00 #18
Så er jeg ikke sikker på hvad du mener :)
Avatar billede jakobdo Ekspert
20. januar 2008 - 19:10 #19
$temp = 0;
sql
while(...){
if($temp == $row['id']){
//Vi arbejder på samme ID som tidligere...
}else{
//Vi arbejder på et nyt ID...
}
$temp = $row['id'];
}
Avatar billede zurekk Nybegynder
20. januar 2008 - 20:13 #20
Med inspiration fra dit forslag, fik jeg lavet dette:

public function setNewItem( $fetch )
{
    $item = &$this->items[];
    $item = new Content;
    $item->constructOfFetch( $fetch );
   
    if( !empty( $fetch['tag'] ) )
    {
        $item->assignTag( $fetch['tag'] );
       
        while( $row = $this->sql->fetchAssoc() )
        {
            if( $row['tag_link'] != $item->id )
                return $this->setNewItem( $row );
           
            $item->assignTag( $row['tag'] );
        }
    }
   
    return true;
}

Smider du et svar :)?
Avatar billede zurekk Nybegynder
20. januar 2008 - 20:14 #21
Glemte vidst lige at sige tak for hjælpen :D
Avatar billede zurekk Nybegynder
20. januar 2008 - 20:14 #22
Hov.. jeg opretter lige en ny tråd :)
Avatar billede jakobdo Ekspert
20. januar 2008 - 20:30 #23
Har smidt et svar i: http://www.eksperten.dk/spm/815692
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