Avatar billede bigtime Nybegynder
28. april 2012 - 18:01 Der 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 ?
Avatar billede bigtime Nybegynder
28. april 2012 - 18:22 #1
har prøvet lidt sådan her men det duer ikke .

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
28. april 2012 - 18:47 #2
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"
Avatar billede bigtime Nybegynder
28. april 2012 - 22:00 #3
jeg prøvede den der

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

det der s. hvad betyder det ?
29. april 2012 - 07:26 #4
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.
Avatar billede bigtime Nybegynder
29. april 2012 - 08:50 #5
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'.
29. april 2012 - 14:23 #6
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
Avatar billede bigtime Nybegynder
30. april 2012 - 06:54 #7
Ja se det fungeret så godt :D
nu er jeg ved at forstå den der join :D
men hvad men erdu med den her sb ON eller bare ON
30. april 2012 - 07:25 #8
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?
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