Avatar billede jansangill Nybegynder
17. december 2007 - 11:08 Der er 12 kommentarer og
1 løsning

sql problem, left join måske?

har denne sql:

SQL = "SELECT *, a.id AS vareID FROM kat_vare a, kat_vare_indh b, kat_vare_placering c LEFT JOIN kat_billede d ON a.id=d.vare_id WHERE a.id=b.vare_id AND a.id=c.v_id AND c.g_id="&nn("kid")&" AND b.sprog_id="&sprogid&" AND b.online=1 ORDER BY c.rakkefolge ASC"


Problemet ligger i at jeg får denne fejl når jeg prøver på det:

Microsoft OLE DB Provider for SQL Server error '80040e14'

The multi-part identifier "a.id" could not be bound.


Meningen er at jeg vil have tabellen kat_billede ind uden at jeg skal behøve at sætte nogle where clauses som mindsker udkommet af recordsettet.

Nogle forslag`?
Avatar billede hrc Mester
17. december 2007 - 22:19 #1
Du blander de to metoder for at joine tabeller. Har omformuleret dit script til dette her der med garanti (hvis ikke, retter jeg det) vil virke.

SELECT *, kv.id AS vareID
  FROM kat_vare kv, kat_vare_placering kvp
  JOIN kat_vare_indh kvi on (kvi.vare_id = kv.id)
  JOIN kat_vare_placering kvp on (kvp.v_id = kv.id)
  LEFT JOIN kat_billede kb ON (kb.vare_id = kv.id)
  WHERE (kvp.g_id = "&nn("kid")&")
    AND (kvi.sprog_id = "&sprogid&")
    AND (kvi.online = 1)
  ORDER BY kvp.rakkefolge ASC

Jeg har bibeholdt * i dig select, men det er noget skrammel at have den med. Angiv de felter du skal bruge
Avatar billede jansangill Nybegynder
17. december 2007 - 22:56 #2
så får jeg stadig denne fejl:

The multi-part identifier "kv.id" could not be bound.
Avatar billede jansangill Nybegynder
17. december 2007 - 22:57 #3
Og ja, jeg burde jo self at sige hvilke felter der skal bruges. Men den samme problem som før er stadig der, at a.id eller nu kv.id ikke vil bindes?
Avatar billede hrc Mester
17. december 2007 - 23:31 #4
Der var en fejl i scriptet (på garantien). Evt kan du prøve at fjerne din "as vareid".

SELECT *, kv.id AS vareID
  FROM kat_vare kv
  JOIN kat_vare_indh kvi on (kvi.vare_id = kv.id)
  JOIN kat_vare_placering kvp on (kvp.v_id = kv.id)
  LEFT JOIN kat_billede kb ON (kb.vare_id = kv.id)
  WHERE (kvp.g_id = "&nn("kid")&")
    AND (kvi.sprog_id = "&sprogid&")
    AND (kvi.online = 1)
  ORDER BY kvp.rakkefolge ASC
Avatar billede jansangill Nybegynder
18. december 2007 - 00:01 #5
Perfekt så virker den sql, har et lille tillægsspørgsmål, da der kan tilhøre en masse billeder til samme vareid, kan man gøre således i sql'en at den kun henter den første id ud der matcher? Eller sidste?
Avatar billede jansangill Nybegynder
18. december 2007 - 00:03 #6
Eller skal det gøres i selve koden?
Avatar billede hrc Mester
18. december 2007 - 09:34 #7
Du kan bruge TOP 1 eller måske DISTINCT. Har en idé om at TOP 1 er bedst i dette tilfælde da DISTINCT antageligvis må hente hele resultatsættet før den "distincter".

SELECT TOP 1 *, kv.id AS vareID
  FROM kat_vare kv
  JOIN kat_vare_indh kvi on (kvi.va

Vil du have det sidste billede kan du vende sorteringsordenen. Er ikke sikker på nedenstående DISTINCT virker efter hensigten men det er nok tæt på.

SELECT DISTINCT *, kv.id AS vareID
  FROM kat_vare kv
  JOIN kat_vare_indh kvi on ..

Jeg har i øvrigt hakket sådan en "hentning af billeddata" op i to selects. Først en grov hvor jeg ikke henter store data, men blot de der er nødvendige for at identificere det rigtige billede. Dernæst en select der henter data. Det er meget uhensigtsmæssigt at hente store mængder data, her billeddata, hvis man bare skal bruge en lille klump.
Avatar billede jansangill Nybegynder
18. december 2007 - 09:41 #8
Hov den misforstud du vidst:)

Lige nu skriver den en "vare" ud 5 gange hvis den har 5 billeder attachet til dens vare_id i katalog_billede.Hvordan kan man gøre således at den kun skriver varen ud 1 gang ?

Hvis det gav mening.
Avatar billede hrc Mester
18. december 2007 - 09:46 #9
Her må DISTINCT (eller GROUP BY) kunne bruges. Måske kan vi få brug for subselects.
Avatar billede jansangill Nybegynder
18. december 2007 - 09:59 #10
Distinct lykkedes ikke, og group by virker kun hvis man har selected kv.id og grouper med kv.id, sådan her:

SELECT kv.id AS vareID FROM kat_vare kv JOIN kat_vare_indh kvi on (kvi.vare_id = kv.id) JOIN kat_vare_placering kvp on (kvp.v_id = kv.id) LEFT JOIN kat_billede kb ON (kv.id=kb.vare_id) WHERE (kvp.g_id = 124) AND (kvi.sprog_id = 1) AND (kvi.online = 1) GROUP BY kv.id

men det hjælper mig jo ikke meget:( Hvis jeg så selecter alt det jeg har brug for.

Hvis jeg gør sådan her:

SELECT kvp.rakkefolge,kvi.navn,kvi.kort_beskr,kvp.g_id,kb.billede, kv.id AS vareID FROM kat_vare kv JOIN kat_vare_indh kvi on (kvi.vare_id = kv.id) JOIN kat_vare_placering kvp on (kvp.v_id = kv.id) LEFT JOIN kat_billede kb ON (kv.id=kb.vare_id) WHERE (kvp.g_id = 124) AND (kvi.sprog_id = 1) AND (kvi.online = 1) GROUP BY kv.id,kvp.rakkefolge,kvi.navn,kvi.kort_beskr,kvp.g_id,kb.billede ORDER BY kvp.rakkefolge ASC

Så skriver den det hele ud som før, uden nogen ændringer.

Måske er det subselects man skal ud i, men hvordan skulle jeg gribe det an?
Avatar billede HenrikSjang Nybegynder
07. marts 2008 - 23:01 #11
Du er meget tæt på at være i mål :)

Når man gruppere, kan man benytte aggregeringsfunktioner, så som MIN, MAX, AVG, SUM, COUNT osv.

I dit tilfælde, selecter du disse 6 kolonner ud:
kvp.rakkefolge
kvi.navn
kvi.kort_beskr
kvp.g_id
kb.billede
kv.id

og du er ikke interesseret i at flere ens kv.id'er optræder hvis der er flere billeder.

Så kan du via group by vælge at selecte (MAX kb.billede) ud, og så undlade at lade kb.billede indgå i group by'en... sådan her (det er næsten magen til det du selv lige har posted)

SELECT kvp.rakkefolge,kvi.navn,kvi.kort_beskr,kvp.g_id,max(kb.billede), kv.id AS vareID FROM kat_vare kv JOIN kat_vare_indh kvi on (kvi.vare_id = kv.id) JOIN kat_vare_placering kvp on (kvp.v_id = kv.id) LEFT JOIN kat_billede kb ON (kv.id=kb.vare_id) WHERE (kvp.g_id = 124) AND (kvi.sprog_id = 1) AND (kvi.online = 1) GROUP BY kv.id,kvp.rakkefolge,kvi.navn,kvi.kort_beskr,kvp.g_id ORDER BY kvp.rakkefolge ASC
Avatar billede jansangill Nybegynder
08. marts 2008 - 09:29 #12
Hehe det var da en glemt spørgsmål:)

Du skal have tak for hjælpen, fandt dog ud af det i diste ende, kan dog ikke huske hvad det endte med.

Smid du et svar.
Avatar billede HenrikSjang Nybegynder
08. marts 2008 - 10:09 #13
Der er forbløffende mange glemte spørgsmål herinde ;)

Men her er et 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