17. december 2007 - 11:08Der 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.
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
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
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?
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.
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 ?
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?
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
Der er forbløffende mange glemte spørgsmål herinde ;)
Men her er et svar.
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.