Avatar billede chriz7913 Nybegynder
07. juni 2011 - 23:32 Der er 3 kommentarer og
1 løsning

Hjælp til sortering af billeder ud fra billed-tags

Hej eksperter.
Jeg har et større problem jeg har gået med de sidste par dage, som jeg ikke har fundet en løsning på.
Jeg er igang med at lave et galleri i Javascript/jQuery, hvor folk har mulighed for at tagge sig på billederne. Billederne i galleriet får jeg fra en inkluderet .js-fil hvor php loader billederne udfra hvilke billeder der findes i det aktuelle album. Den måde jeg loader billederne fra databasen er at jeg finder billeder i tabellen 'billeder' og left-joiner tabellen 'tags' så, hvor efter jeg så sortere billederne i PHP, så det der videresendes til mit javascript ser nogenlunde sådan her ud:
----------------------
var photos={'billed-id':['billedets-placering','kilde','højde','bredde','album-id','tags'],'billed-id2':[..forsætter..]};
----------------------
'tags' i arrayet er inddelt således at for hvert tag der findes på et billede, skrives der 'id.fulde-navn.kordi-x.kordi-y.mulighed-for-fjern:id2.fulde-navn2.kordi-x2.kordi-y2.mulighed-for-fjern:id3.fulde-navn3...osv' hvor hvert tag er opdelt af et kolon, og informationerne i hvert tag er opdelt af et punktum.

Alt dette fungere i bund og grund allerede.
Mit problem lyder på at jeg nu skal sammensætte et array, hvor det kun findes billeder hvor der er en bestemt bruger tagget på, samt også at lave et andet array hvor to bestemte brugere er tagget på alle billederne. Jeg har allerede forsøgt mig med at finde billeder hvor én bestemt bruger er på, ved at bytte billeder.album_id='".$album-id."' ud med tags.brugerid='".$brugerid."' med så er det kun tags med denne bruger der kommer med, og hvis andre personer er tagget på samme billede, bliver de ikke vist.

Min SQL-forespørgsel lyder følgende:
SELECT billeder.id, billeder.album_id, billeder.src, billeder.storrelsen, billeder.comments, billeder.owner_id, tags.brugerid, tags.frabrugerid, tags.kordx, tags.kordy, (SELECT concat(fornavn,' ',efternavn) FROM brugere WHERE brugere.id=tags.brugerid) AS navn FROM billeder LEFT JOIN tags ON tags.billede=billeder.id AND tags.slettet!='1' WHERE billeder.removed!='1' AND billeder.album_id='".$album-id."' ORDER BY billeder.ordering ASC, tags.id DESC

Alle der har forslag, idéer til omstrukturering, eller bare har spørgsmål, er selvfølgelig meget velkomne til at svare.
Hav en god aften.

Mvh. Christoffer
08. juni 2011 - 08:31 #1
Ikke testet - men du vil have billeder hvor et af taggene er for en bestemt bruger.  Det må være 'WHERE tags.billede IN (SELECT billeder FROM tags WHERE brugerid = $brugerid)'

eller i sammenhæng med de andre valgkriteria

WHERE billeder.removed!='1' AND billeder.album_id='".$album-id."' AND tags.billeder IN (SELECT billeder FROM tags WHERE brugerid = $brugerid)

Og så kan jeg ikke dy mig for at foreslå at du anvender aliasser for tabellerne for at gøre forespørgslen kortere og mere oversigtelig.  Yderligere, hvis du kalder forespørgslen fra php anførselstegn kan du bruge $-variablerne direkte.  Jeg foreslår noget i retning af dette (igen - ikke testet):

$result = mysql_query("SELECT b.id, b.album_id, b.src, b.storrelsen, b.comments, b.owner_id, t.brugerid, t.frabrugerid, t.kordx, t.kordy, CONCAT(b.fornavn, ' ', b.efternavn) AS navn
FROM billeder b
LEFT JOIN tags t ON b.id = t.billede
LEFT JOIN brugere b ON t.brugerid = b.id
WHERE b.removed != '1'
AND b.album_id = $album-id
AND t.billede IN (SELECT billede FROM tags WHERE brugerid = $brugerid) ORDER BY b.ordering ASC, t.id DESC")
10. juni 2011 - 09:28 #2
chriz7913, fik du mit indlæg?  Var det til hjælp?  Lad mig høre.
Avatar billede chriz7913 Nybegynder
11. juni 2011 - 20:25 #3
Sorry jeg ikke har svaret indtil nu, har været på arbejde næsten non-stop de sidste par dage, men jeg afprøvede din løsning og den virker perfekt, (også den med at finde billeder af to brugere, jeg sætter bare din løsning ind to gange med et AND imellem).
I starten var den ret langsom, men efter jeg fik indexeret rækken 'billeder' i tabellen 'tags', virker det upåklageligt!
Læg et svar, og tak for hjælpen - forsat god sommer! :)
11. juni 2011 - 21:11 #4
Svar.
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