28. april 2012 - 18:01Der er
7 kommentarer og 1 løsning
Hente fra 2 tabeller i dben ?
jeg har en søge form på siden hvor man selvfølgelig kan søge :D men de ord den skal søge i er i en tabel og hvis den finder noget skal den se i en anden tabel om der er billede til, men der kan godt være flere end et billede så den skal bare tage det sidste uploadet billede og der er en række der hedder opload_tid.
den sql jeg bruger nu virker som fint men den tager ikke billede med
"select * from salg where (beskrivelse LIKE '%$ord%' OR seek LIKE '%$ord%') AND aktiv='1' order by annonce_start desc LIMIT 0,10"
billederne ligger i tabellen salgs_billeder
jeg skal vel nok bruge den der JOIN men kan ikke helt dreje hvordan jeg skal lave de kriterier for den vælger de billeder der høre til den rigtige annonce.
er mit spørgsmål til at forst eller forvirre den mere ?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
SELECT s.*, sb.billede FROM salg WHERE beskrivelse LIKE '%$ord%' OR seek LIKE '%$ord%' s JOIN (SELECT * FROM salgs_billeder WHERE brugerID='$brugerID' GROUP BY annonceID) sb ON s.annonceID = sb.annonceID ORDER BY s.annonce_start desc
Jeg forstår, at du vil vælge de ti nyeste annoncer der har beskrivelse eller seek LIKE %%$ord%. Hvis en annonce ikke har noget billed vises den uden billed. Hvis en annonce har et eller flere billeder vises den med det billed der har den højeste værdi i feltet opload_tid. Hvis det er korrekt vil jeg foreslå denne query (ikke testet):
SELECT s.*, sb.billede FROM salg s JOIN (SELECT * FROM salgs_billeder WHERE annonceID = s.annonceID ORDER BY opload_tid DESC LIMIT 1) sb WHERE (s.beskrivelse LIKE '%$ord%' OR s.seek LIKE '%$ord%') AND s.aktiv='1' ORDER BY s.annonce_start desc LIMIT 0,10"
SELECT s.*, sb.billede FROM salg s JOIN (SELECT * FROM salgs_billeder WHERE annonceID = s.annonceID ORDER BY opload_tid DESC LIMIT 1) sb WHERE (s.beskrivelse LIKE '%$ord%' OR s.seek LIKE '%$ord%') AND s.aktiv='1' ORDER BY s.annonce_start desc LIMIT 0,10" men så kom den med fejlen Unknown column 's.annonceID' in 'where clause' så fjernet jeg s. så kom billedet men det var ikke det billede der tilhørte den annonce
1. Unknown column 's.annonceid' in 'where clause'. Så det felt i salg hvor en annonces identitet står hedder ikke anonceID. Hvad hedder feltet så? Hedder det simpelt hen 'id' eller måske 'annonceid' eller 'annonce_id'. Hvis feltet for eksempel hedder 'annonceid' skal du ændre koden til 'WHERE annonceID = s.annonceid' o.s.v.
2. Det med s. hvad betyder det? Ved i forespørgslen at sige 'FROM salg s' giver du tabellen salg øgenavnet s. Når du har en forespørgsel over flere tabeller skal du fortælle hvilken tabel du mener. Hvis du blot skriver 'SELECT * FROM salgs_billeder WHERE annonceID = annonceID', så søger du efter billeder hvis identitet er lig med sig selv, og det passer på alle billederne, og så får du bare det nyeste billede i tabellen. Det du vil have er et billede hvis identitet er lig med identiteten i sales af den pågældende annonce, og så er du nødt til at forklare 'WHERE annonceID = sales.annonceID' eller, hvis du bruger øgenavnet, 'WHERE annonceID = s.annonceID' (og så skal du som sagt i stedet for s.annonceID bruge det nøjagtige navn på feltet i sales med identiteten.)
Jeg tillader mig at oprette dette som svar, så det er på plads, når tiden er inde til at lukke.
hey . ja jeg rode med det sent igår og fandt ud af det med s. men den kulunde hedder annonceID men det er lige så snart noget kommer ind i den (SELECT * FROM salgs_billeder WHERE annonceID = s.annonceID ORDER BY opload_tid DESC LIMIT 1) så der intet med s. der virker så skriver den bare Unknown column 's.id' in 'where clause'. Unknown column 's.ID' in 'where clause'. Unknown column 's.annonceID' in 'where clause'. Unknown column 's.annonceid' in 'where clause'. Unknown column 's.brugerID' in 'where clause'. Unknown column 's.brugerid' in 'where clause'.
Det er fordi det er mig der klokker rundt i det. Jeg tænkte det igennem igen og lavede et par tests (som jeg skulle have gjort til at begynde med) og kom frem til sådan en forespørgsel. I den indre forespørgsel selecter jeg alt fra salgs_billeder order by opload_tid DESC. I den ydre forespørgsel selecter jeg alt fra salg hvor beskrivelse eller seek LIKE %ord% og aktiv = 1. Derefter joiner jeg den ydre forespørgsel med den indre hvor s.annonceID = sb.annonceID. Det giver mig, for hver annonce, alle billeder med det nyeste først. Ved derefter at sige GROUP BY s.annonceID får jeg kun et billed, det nyeste, for hver annonce.
Altså: SELECT s.*, sb.billede FROM salg s JOIN (SELECT * FROM salgs_billeder ORDER BY opload_tid DESC) sb ON s.annonceID = sb.annonceID WHERE (s.beskrivelse LIKE '%$ord%' OR s.seek LIKE '%$ord%') AND s.aktiv='1' GROUP BY s.annonce_start ORDER BY s.annonce_start desc LIMIT 0,10
Det er godt det virker. Dit sidste spørgsmål forstår jeg ikke. Et par ord mere om JOIN. Normalt joiner man to bestående tabeller. I dette spørgsmål er det specielt, fordi der joines en bestående tabel, nemlig salg, som får øgenavnet s, med en tabel der laves på stedet, nemlig resultatet af "SELECT * FROM salgs_billeder ORDER BY opload_tid DESC" som får øgenavnet sb. Tag disse to tabeller:
tabel1 id navn 1 hans 2 jens 3 sofus
tabel2 id bruger køretøj 1 1 bil 2 1 cykel 3 3 knallert
Her har hans en bil og en cykel, sofus har en knallert, og jens har ingenting.
Hvis du siger: SELECT tabel1.*, tabel2.køretøj FROM tabel1 JOIN tabel2
så får du for hver række i tabel1 alle rækkerne i tabel2, således
id navn køretøj 1 hans bil 1 hans cykel 1 hans knallert 2 jens bil 2 jens cykel 2 jens knallert 3 sofus bil 3 sofus cykel 4 sofus knallert
Men det er for meget. Du vil kun se linjer hvor der er brugere der har køretøj, og så kun deres egne køretøjer. Med andre ord, der hvor bruger i tabel2 er det samme som id i tabel1. Så i stedet for blot at sige FROM tabel1 JOIN tabel2 siger du:
FROM tabel1 JOIN tabel2 ON tabel1.id = tabel2.bruger
eller gør det kortere ved hjælp af øgenavne:
FROM tabel1 t1 JOIN tabel2 t2 ON t1.id = t2.bruger.
Så får du dette resultat:
1 hans bil 1 hans cykel 3 sofus knallert
Du får ikke nogen linje med jens, fordi han ikke har noget køretøj. Hvis du vil have jens med, med en tom plads for køretøj, så erstatter du JOIN med LEFT JOIN:
FROM tabel1 t1 LEFT JOIN tabel2 t2 ON t1.id = t2.bruger.
Så får du dette resultat:
1 hans bil 1 hans cykel 2 jens 3 sofus knallert
Har jeg svaret på det du var i tvivl om i #7?
Synes godt om
Ny brugerNybegynder
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.