Avatar billede jansangill Nybegynder
18. december 2007 - 23:06 Der er 37 kommentarer og
1 løsning

sql,count

Halloi, håbede der var en eller 2 som måske kuinne hjælpe mig med at flette en count ind i min sql. Meningen er at jeg vil left joine en count ind i min sql for at tælle antal forkomster af g_id i tabellen kat_vare_placering, men det lykkedes bare slet ikke for mig. Får hele tiden forskelliege fejl, såsom denne her:

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

Her er sql'en:

SELECT *, a.id as gID, a.parent_id FROM kat_varegrp a, kat_varegrp_indh b

LEFT JOIN(SELECT COUNT(g_id) AS antalKommentarer FROM kat_vare_placering c ON a.id=c.g_id)

WHERE a.id = b.grp_id
AND a.butik_id = "&butikID&"
AND b.sprog_id = "&sprogid&"
AND b.online = 1
ORDER BY a.parent_id, a.rakkefolge ASC"


Skal siges at sql'en virker fint uden jeg prøver at left joine en count ind, men har desværre brug for at vide antal af forekomster:(

Help.
Avatar billede softspot Forsker
18. december 2007 - 23:09 #1
Hvilken database er det?
Avatar billede jansangill Nybegynder
18. december 2007 - 23:09 #2
MS SQL
Avatar billede softspot Forsker
18. december 2007 - 23:12 #3
Hvilke felter i dine 3 tabeller er primære og fremmednøgler (og hvordan refererer de hinanden)?
Avatar billede a1a1 Novice
18. december 2007 - 23:18 #4
når du skirver

SELECT *, a.id as gID, a.parent_id FROM kat_varegrp a, kat_varegrp_indh b
osv..

vælger du jo ALLE felter fra kat_varegrp_indh

det du nok mangler er en "GROUP BY"

DVS...
GROUP BY a.iD (kan være gID),  a.parent_id, osv, osv (efter eller før din "group by"
Avatar billede jansangill Nybegynder
18. december 2007 - 23:19 #5
kat_varegrp:
id(a.id)

kat_varegrp_indhold:
id
grp_id ()b.grp_id-->refererer id i kat_varegrp

kat_vare_placering:
id
g_id(c.g_id-)->referer id i kat_varegrp


Håber det fdorklarer det
Avatar billede softspot Forsker
18. december 2007 - 23:23 #6
Umiddelbart ville jeg forvente at du skulle joine kat_varegrip, kat_varegrp_indh og kat_vare_placering og så optælle kat_vare_placering.*, samt gruppere på de resterende felter.

Jeg kan ikke lige gennemskue hvorfor du vil tildele alias til a.id og hvorfor a.parent_id skal vælges 2 gange (en gang via * og en gang ved specifik angivlse af kolonnen a.parent_id)?

Mit umiddelbare bud ville være noget i stil med:

SELECT
  a.id, a.parent_id, a.butik_id, a.rakkefolge
  b.id, b.sprog_id, b.online,
  COUNT(c.*) as antalKommentarer
FROM
  kat_varegrp AS a
  INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
  LEFT JOIN kat_vare_placering AS c ON c.g_id = a.id
WHERE
  a.butik = @butikID
  AND b.sprog_id = @sprogID
  AND b.online = 1
GROUP BY
  a.id, a.parent_id, a.butik_id, a.rakkefolge
  b.id, b.sprog_id, b.online
ORDER BY
  a.parent_id, a.rakkefolge
Avatar billede softspot Forsker
18. december 2007 - 23:25 #7
@butikID og @sprogID er så pladsholdere for de to "parametre" du har i den oprindelige SQL-sætning.
Avatar billede jansangill Nybegynder
18. december 2007 - 23:35 #8
hej tak for responsen

Ummudelbart får jeg denne fejl så:

Her er sql'en, cleanet lidt up efter mit behov.

SELECT a.id as gID,a.parent_id,a.rakkefolge,b.navn,b.url,b.beskrivelse,b.grp_id, COUNT(c.*) as antalKommentarer
FROM kat_varegrp AS a INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
LEFT JOIN kat_vare_placering AS c ON c.g_id = a.id
WHERE a.butik = "&butikID&"
AND b.sprog_id = "&sprogid&"
AND b.online = 1
GROUP BY a.id ,a.parent_id,a.rakkefolge,b.navn,b.url,b.beskrivelse,b.grp_id
ORDER BY a.parent_id, a.rakkefolge

Får denne fejl.

Incorrect syntax near '*'.
Avatar billede softspot Forsker
18. december 2007 - 23:36 #9
Ups! Der mangler lige et komma efter a.rakkefolge i select-listen og i group by-listen. Desuden skrev jeg a.butik i stedet for a.butik_id i where-delen.

SELECT
  a.id, a.parent_id, a.butik_id, a.rakkefolge,
  b.id, b.sprog_id, b.online,
  COUNT(c.*) as antalKommentarer
FROM
  kat_varegrp AS a
  INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
  LEFT JOIN kat_vare_placering AS c ON c.g_id = a.id
WHERE
  a.butik_id = @butikID
  AND b.sprog_id = @sprogID
  AND b.online = 1
GROUP BY
  a.id, a.parent_id, a.butik_id, a.rakkefolge,
  b.id, b.sprog_id, b.online
ORDER BY
  a.parent_id, a.rakkefolge
Avatar billede softspot Forsker
18. december 2007 - 23:38 #10
OK, sidste post var nok overflødig :)

Det kan evt. prøve blot at skrive COUNT(*) i stedet for COUNT(c.*)
Avatar billede jansangill Nybegynder
18. december 2007 - 23:45 #11
Vi nærmer os, men lige nu er der de her problmer:

Har en nText med i query og billede skal også være med, og de skal nok også groupes, som d eikke må da de ikke må sammenlignes.

Derudover tæller den korrekt, men den tæller 1 ved dem der er 0
Avatar billede softspot Forsker
18. december 2007 - 23:47 #12
For lige at adressere den med optællingen, så tror jeg du skal lave en subquery som returnerer antal kommentarer i stedet og så fjerne LEFT JOIN helt:

SELECT
  a.id as gID,a.parent_id,a.rakkefolge,
  b.navn,b.url,b.beskrivelse,b.grp_id,
  (SELECT COUNT(*) FROM kat_vare_placering WHERE g_id = a.id) AS antalKommentarer
FROM
  kat_varegrp AS a
  INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
WHERE
  a.butik = "&butikID&"
  AND b.sprog_id = "&sprogid&"
  AND b.online = 1
GROUP BY
  a.id ,a.parent_id,a.rakkefolge,b.navn,b.url,b.beskrivelse,b.grp_id
ORDER BY
  a.parent_id, a.rakkefolge
Avatar billede softspot Forsker
18. december 2007 - 23:52 #13
Hvilken tabel ligger teksten og billedet i?

Du kan evt. lave hele den forrige query til en subquery og så vælge dine blob-felter i en query baseret på den du lige har fået til at fungere.

SELECT d.*, e.tekst, e.billede
FROM (
  SELECT
    a.id as gID,a.parent_id,a.rakkefolge,
    b.navn,b.url,b.beskrivelse,b.grp_id,
    (SELECT COUNT(*) FROM kat_vare_placering WHERE g_id = a.id) AS antalKommentarer
  FROM
    kat_varegrp AS a
    INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
  WHERE
    a.butik = "&butikID&"
    AND b.sprog_id = "&sprogid&"
    AND b.online = 1
  GROUP BY
    a.id ,a.parent_id,a.rakkefolge,b.navn,b.url,b.beskrivelse,b.grp_id
) AS d
INNER JOIN kat_varegrp_indh AS e ON e.id = d.gID
ORDER BY
  d.parent_id, d.rakkefolge
Avatar billede jansangill Nybegynder
19. december 2007 - 00:01 #14
Der skal ikke flere tabeller ind i denne query. Teksten er b.beskrivelse. og billedte glmete jeg er nvharchar, så det e rikke et problem.

Kan man komme uden om dette problem?


Nu da jeg har dig her, kan jeg belemre dig med et tillægsspørgsmål, hvis du har tiden det er self.?
Avatar billede softspot Forsker
19. december 2007 - 00:12 #15
Jeg vil stadig mene at du bare skal flytte beskrivelsen ud af subquery'en som jeg har illustreret i eksemplet 18/12-2007 23:52:42, altså sådan her:

SELECT d.*, e.beskrivelse, e.billede
FROM (
  SELECT
    a.id as gID, a.parent_id, a.rakkefolge,
    b.navn, b.url, b.grp_id,
    (SELECT COUNT(*) FROM kat_vare_placering WHERE g_id = a.id) AS antalKommentarer
  FROM
    kat_varegrp AS a
    INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
  WHERE
    a.butik = "&butikID&"
    AND b.sprog_id = "&sprogid&"
    AND b.online = 1
  GROUP BY
    a.id, a.parent_id, a.rakkefolge,
    b.navn, b.url, b.grp_id
) AS d
INNER JOIN kat_varegrp_indh AS e ON e.id = d.gID
ORDER BY
  d.parent_id, d.rakkefolge

Spørg bare løs, så må vi se om jeg kan hjælpe... :-)
Avatar billede jansangill Nybegynder
19. december 2007 - 00:19 #16
ok mange tak for det:)

har denne sql, som har irreteret mig et lille stykke tid:

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

Lige nu virker den næsten efter hensigten, men den optæller alt for mange records.

baggrundsinformation:

Jeg left joiner ind en tabel, som indeholder masser af billeder, som bliver gemt som alm nvchar.

a.id, som er "varen" kan have masse af billeder til samme id, uendelig faktisk.

Problemet lige nu ligger i at hvis i billede tabbelen der er 5 billeder til en vare, så bliver den skrevet ud 5 gange, som jeg finder mærkelig, da jeg left joiner den ind. Men det er der sikkert en forklaring på.

Det der skal ske er at den kun skriver varen ud 1 gang, og ikke 5 gange, hvis der er 5 billeder.

Håber alt dette gav mening.
Avatar billede jansangill Nybegynder
19. december 2007 - 00:20 #17
wups glemte at skrive dne rigtig ud sql'en:

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 (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 softspot Forsker
19. december 2007 - 00:28 #18
Hvis du kun vil have en række uanset antallet af billeder, så har du umiddelbart to muligheder:

1. lad være med at joine til billedetabellen
2. lav en aggregat funktion på et felt i billedetabellen (f.eks. COUNT) og gruppér på alle andre felter i dit resultat.

LEFT JOIN sikrer bare at du får alle berørte rækker fra "venstre"-tabellen (den tabel der står på venstre side af LEFT JOIN) med i dit resultat uanset om "højre"-tabellen indeholder relaterede data eller ej. Hvis "højre"-tabellen ikke indeholder data, vil alle kolonner fra denne tabel blot indeholde NULL i det samlede resultat. Indeholder "højre"-tabellen derimod flere rækker pr. række i "venstre"-tabellen, så vil resultatet indeholde fulde rækker for alle de, til "venstre"-tabellen, relaterede rækker i "højre"-tabellen.
Avatar billede jansangill Nybegynder
19. december 2007 - 00:29 #19
mhs til din sidste kommentar, så giver den denne fejl på det hele:

Incorrect syntax near 'grp_id'.

Som er ligefør du selecter for anden gang.
Avatar billede a1a1 Novice
19. december 2007 - 00:29 #20
?
SELECT DISTINCT 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 (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
19. december 2007 - 00:31 #21
I løsning nummer et hvor du siger, lad være med at joine til billedtabellen, vil du så mene jeg skal lave en subselect istedet?
Avatar billede jansangill Nybegynder
19. december 2007 - 00:33 #22
hehe a1, tro mig den er prøvet, udskriver nøjaftig det samme.
Avatar billede softspot Forsker
19. december 2007 - 00:39 #23
Ja, enten en forspørgsel mere i databasen for hver vare eller iterér over et samlet resultat (med både vare og billededata) og vis dine billeder (hvis det er det du vil ifm. visning af hver vare), indtil varens id skifter. Den sidste løsning er ikke speciel optimal, da du potentielt set transporterer en masse redundante data i de tilfælde hvor der er flere billeder til en vare.

Et tredie alternativ (som jeg ikke har nogen erfaring med og viden om hvorvidt det faktisk kan lade sig gøre), er at lave et shaped resultat, hvor du har et resultat med delresultater til hver række (dvs. i dit tilfælde billeder til en given vare). Men som sagt, så er det ikke noget jeg har prøvet, så der kan jeg ikke hjælpe :(
Avatar billede softspot Forsker
19. december 2007 - 00:45 #24
mht. 19/12-2007 00:29:00 >> Mon det er fordi jeg har skrevet

) AS d

i stedet for

) d

idet jeg tildeler den store subquery et alias...? Prøv lige at ændre det :)
Avatar billede jansangill Nybegynder
19. december 2007 - 00:47 #25
OK mange tak for hjælpen softspot.

Du har vist mere end fortjent at ligge et svar nu.

Vil det være muligt engang imorgen når jeg har prøvet at teste det igennem, at skrive til dig herinde, hvis det ikke lykkedes?
Avatar billede softspot Forsker
19. december 2007 - 00:47 #26
19/12-2007 00:29:46 >> DISTINCT virker på hele rækkens data og hvis billederne er forskellige, så vil rækken medtages i resultatet selvom varens data er ens.
Avatar billede softspot Forsker
19. december 2007 - 00:48 #27
Jada! Du skriver bare, så jeg opdager den nok da jeg jo abonnerer på tråden i.o.m. jeg har kommenteret på den :-)
Avatar billede jansangill Nybegynder
19. december 2007 - 00:52 #28
mht. 19/12-2007 00:29:00 >> Mon det er fordi jeg har skrevet

) AS d

i stedet for

) d

Hjalp desværr eikke meget
Avatar billede softspot Forsker
19. december 2007 - 00:54 #29
Hm... ok, kan du ikke prøve at vise den kode hvor du har skrevet SQL-sætningen (jeg antager du har flettet den ind i noget VBScript eller sådan noget)?

Tak for point :)
Avatar billede jansangill Nybegynder
19. december 2007 - 00:58 #30
Det eneste der er på siden er sql'en og så et loop af den recordset.
Avatar billede softspot Forsker
19. december 2007 - 01:00 #31
Fair nok, jeg ville egentlig også bare se om der kunne have sneget sig en fejl ind i strengsammensætningen ifm. sql-sætningen :)
Avatar billede jansangill Nybegynder
19. december 2007 - 01:05 #32
sql'en ser såldes ud lige pt:

sql="SELECT d.*, e.beskrivelse FROM (SELECT a.id as gID, a.parent_id, a.rakkefolge, a.billede,b.navn, b.url, b.grp_id,(SELECT COUNT(*) FROM kat_vare_placering WHERE g_id = a.id) AS antalKommentarer FROM kat_varegrp AS a INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id WHERE a.butik_id = "&butikID&" AND b.sprog_id = "&sprogid&" AND b.online = 1 GROUP BY a.id, a.parent_id, a.rakkefolge,a.billede, b.navn, b.url, b grp_id) AS d INNER JOIN kat_varegrp_indh AS e ON e.id = d.gID ORDER BY d.parent_id, d.rakkefolge"

Og fik prøvet både dedt med )d, og ) AS d
Avatar billede softspot Forsker
19. december 2007 - 01:17 #33
Der må være et problem med kobling af relationen mellem e (i den ydre forspørgsel) og b (i den indre forspørgsel). Det jeg har gjort er at koble e med a i stedet for e med b (det er jo i b beskrivelsen ligger), så derfor skal id'et for b også medtages i den indre query, så jeg kan koble e med b via dette id i den ydre forspørgsel.

(Jeg tillader mig lige at bruge min egen version af SQL-sætningen, da jeg lettere kan overskue denne - jeg håber ikke du synes det er for træls at skulle omskrive den hele tiden :-)):

SELECT d.*, e.beskrivelse, e.billede
FROM (
  SELECT
    a.id AS gID, a.parent_id, a.rakkefolge,
    b.navn, b.url, b.grp_id, b.id AS bID,
    (SELECT COUNT(*) FROM kat_vare_placering WHERE g_id = a.id) AS antalKommentarer
  FROM
    kat_varegrp AS a
    INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
  WHERE
    a.butik = "&butikID&"
    AND b.sprog_id = "&sprogid&"
    AND b.online = 1
  GROUP BY
    a.id, a.parent_id, a.rakkefolge,
    b.navn, b.url, b.grp_id, b.id
) AS d
INNER JOIN kat_varegrp_indh AS e ON e.id = d.bID
ORDER BY
  d.parent_id, d.rakkefolge


Jeg er slet ikke sikker på at dette er årsagen til fejlen, men det er da under alle omstændigheder mere korrekt end det andet ;-)
Avatar billede softspot Forsker
19. december 2007 - 01:36 #34
Det er da grov som jeg reintroducerer fejl i den SQL-sætning! Prøver lige igen, med udgangspunkt i din:

SELECT
  d.*, e.beskrivelse
FROM (
  SELECT
    a.id as gID, a.parent_id, a.rakkefolge, a.billede,
    b.navn, b.url, b.grp_id, b.id AS bID,
    (SELECT COUNT(*) FROM kat_vare_placering WHERE g_id = a.id) AS antalKommentarer
  FROM
    kat_varegrp AS a
    INNER JOIN kat_varegrp_indh AS b ON b.grp_id = a.id
  WHERE
    a.butik_id = "&butikID&"
    AND b.sprog_id = "&sprogid&"
    AND b.online = 1
  GROUP BY
    a.id, a.parent_id, a.rakkefolge, a.billede,
    b.navn, b.url, b.grp_id, b.id
) AS d
INNER JOIN kat_varegrp_indh AS e ON e.id = d.bID
ORDER BY
  d.parent_id, d.rakkefolge

Aha! Det var nok en god idé at tage udgangspunkt i din, for jeg fandt lige ud af at der manglede et punktum mellem b og grp_id lige inden den afsluttende parantes. Jeg har rettet i den ovenstående, incl. join på den rigtige tabel ifht. beskrivelsen.
Avatar billede jansangill Nybegynder
19. december 2007 - 08:13 #35
aha, så er den på plads:) Nu vil jeg prøve at se om jeg kan få den anden til at virke - lad udfordingen begynde.
Avatar billede softspot Forsker
19. december 2007 - 08:48 #36
Ja, man kan næsten ikke få luft af bare spænding! ;-)
Avatar billede jansangill Nybegynder
19. december 2007 - 11:05 #37
ja jeg valgte den nemme løsning for nu. Har lavet et loop i mit loop hvor jeg udskriver billederne. En dum løsning, men den sql kunne jeg ikke gennemskue, desværre.
Avatar billede softspot Forsker
19. december 2007 - 12:12 #38
Fair nok, det er vel også dig der skal vedligeholde den i fremtiden og så duer det jo ikke, hvis du ikke ved hvad du har lavet :-)
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
Kurser inden for grundlæggende programmering

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