Avatar billede phpbegynder2004 Nybegynder
13. november 2008 - 00:56 Der er 10 kommentarer og
1 løsning

Hent fra flere tabeller

Hej,

Jeg har en hjemmeside, hvor man kan skrive kommentarer til nogle videoklip og nogle beretninger.

På forsiden ønsker jeg et overblik over de nyeste kommentarer. Der skal altså udtrækkes kommentarer fra de to tabeller "beretninger_kommentarer" og "video_kommentarer" og så sorteres efter dato:

SELECT beretningid, brugerid, kommentar, dato FROM beretninger_kommentarer WHERE rights<='3'
UNION SELECT videoid, brugerid, kommentar, dato FROM video_kommentarer WHERE rights<='3'
ORDER BY dato DESC LIMIT 20

Et af felterne jeg udtrækker er brugerid. Jeg ønsker at udskifte dette med et navn (nick). Men hvordan kan jeg gøre det. Normalt gør jeg således:
SELECT users.nick (...) FROM (...)
LEFT JOIN users ON users.id=beretninger_kommentarer.brugerid

Er der nogen der kan hjælpe?
Avatar billede arne_v Ekspert
13. november 2008 - 01:29 #1
Så skal du vel LEFT JOIN's med users i begge 2 SELECT som du UNION'er.
Avatar billede arne_v Ekspert
13. november 2008 - 01:29 #2
SELECT beretningid, brugerid, kommentar, dato FROM beretninger_kommentarer LEFT JOIN users ON users.id=beretninger_kommentarer.brugerid WHERE rights<='3'
UNION SELECT videoid, brugerid, kommentar, dato FROM video_kommentarer LEFT JOIN users ON users.id=video_kommentarer.brugerid WHERE rights<='3'
ORDER BY dato DESC LIMIT 20
Avatar billede arne_v Ekspert
13. november 2008 - 01:30 #3
Men tror du ikke at det ville være bedre med kun 1 tabel med 1 felt som angav om det var
en beretning kommentar eller en video kommentar ?
Avatar billede phpbegynder2004 Nybegynder
13. november 2008 - 21:46 #4
Hej Arne,
Mange tak for hjælpen. Koden virker fint, og er ændret til nedenstående, men er der nogle ændringer der kan optimere koden?

SELECT users.nick, videoid, brugerid, kommentar, dato, tabel FROM video_kommentarer
LEFT JOIN users ON users.id=video_kommentarer.brugerid WHERE video_kommentarer.rights<='3'
UNION SELECT users.nick, beretningid, brugerid, kommentar, dato, tabel FROM beretninger_kommentarer
LEFT JOIN users ON users.id=beretninger_kommentarer.brugerid WHERE beretninger_kommentarer.rights<='3'
UNION SELECT users.nick, bookings.id, brugerid, kommentar, dato, tabel FROM bookings
LEFT JOIN users ON users.id=bookings.brugerid
ORDER BY dato DESC LIMIT 20
Avatar billede arne_v Ekspert
14. november 2008 - 01:16 #5
Optimeringer vil nok mest bestaa i at have de rigtige index.

Proev evt. med UNION ALL fremfor UNION.
Avatar billede phpbegynder2004 Nybegynder
16. november 2008 - 15:15 #6
Okay, tak! Læg venligst et svar :)
Avatar billede arne_v Ekspert
16. november 2008 - 15:18 #7
svar
Avatar billede phpbegynder2004 Nybegynder
18. november 2008 - 19:15 #8
Hej igen arne,

Jeg har et problem. Når jeg kører på localhost fungerer nedenstående query fint, men når jeg uploader det til min udbyders server får jeg timeout error. Det er ikke en php fejl, men derimod Firefox der siger, at siden overskrid tidsbegræsningen.
Hvad gør jeg galt?

SELECT users.nick, video.titel, video_kommentarer.videoid AS id, kommentar, video_kommentarer.dato, tabel FROM video_kommentarer
LEFT JOIN users ON users.id=video_kommentarer.brugerid
LEFT JOIN video ON video.id=video_kommentarer.videoid
WHERE video_kommentarer.rights<='".$_SESSION[rights]."'

UNION ALL SELECT users.nick, beretninger.emne, beretningid, kommentar, beretninger_kommentarer.dato, tabel FROM beretninger_kommentarer
LEFT JOIN users ON users.id=beretninger_kommentarer.brugerid
LEFT JOIN beretninger ON beretninger.id=beretninger_kommentarer.beretningid
WHERE beretninger_kommentarer.rights<='".$_SESSION[rights]."'

UNION ALL SELECT users.nick, album.title, albumid, besked, album_kommentarer.dato, tabel FROM album_kommentarer
LEFT JOIN users ON users.id=album_kommentarer.brugerid
LEFT JOIN album ON album.id=album_kommentarer.albumid
WHERE album_kommentarer.rights<='".$_SESSION[rights]."'

UNION ALL SELECT users.nick, uge, bookings.id, kommentar, dato, tabel FROM bookings
LEFT JOIN users ON users.id=bookings.brugerid
ORDER BY dato DESC LIMIT 40
Avatar billede phpbegynder2004 Nybegynder
18. november 2008 - 19:23 #9
Ovenstående query hedder $hent_updates. Derfor kommer udskrivningen således til udtryk:

while($updates = mysql_fetch_assoc($hent_updates)){
  if($updates[tabel]=="video"){
    echo "Ny video etc blabla";
  }elseif($updates[tabel]=="beretninger"){
    echo "Ny beretning etc blabla";
  }elseif($updates[tabel]=="album"){
    echo "Nyt album etc blabla";
  }else{
    echo "Ny booking etc blabla";
  }
}

På forhånd tak for hjælpen!
Avatar billede arne_v Ekspert
18. november 2008 - 19:26 #10
Har du index paa all felterne i ON og WHERE betingelser ?
Avatar billede phpbegynder2004 Nybegynder
22. november 2008 - 15:05 #11
Det har jeg i hvert fald nu - lader til at virke :)
Igen tak! :)
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
Computerworld tilbyder specialiserede kurser i database-management

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