Gå til innhold

[Løst]Problemer med mySQL spørring


Anbefalte innlegg

Hei,

 

Jeg har denne spørringen:

$sql = "
			SELECT
				(
				SELECT
					COUNT(`logistikk`)
				FROM
					`contents`
				WHERE
					`logistikk`='J'
				) AS `logistikk`,
				(
				SELECT
					COUNT(`transphjelp`)
				FROM
					`contents`
				WHERE
					`transphjelp`='J'
				) AS `transphjelp`,
				SUM(`ankkolli`) as `ankkolli`,
				(
				SELECT
					COUNT(`foredrag`)
				FROM
					`contents`
				WHERE
					`foredrag`='J'
				) AS `foredrag`,
				SUM(`rektbord`) AS `rektbord`,
				SUM(`stolar`) AS `stolar`,
				SUM(`struttak`) AS `struttak`,
				SUM(`antmiddag`) AS `antmiddag`
			FROM
				`contents`
			";

 

Feilmeldingen jeg får er:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT(`logistikk`) FROM `contents`

 

Håper noen kan hjelpe.

Lenke til kommentar
Videoannonse
Annonse

Du har vel ikke så gammel versjon av mysql at subselects ikke støttes?

 

Prøver å kjøre en tilsvarende spørring på min versjon 5.et.eller.annet og det funker ihvertfall der.

 

Ser heller ikke noe feil i spørringen. Prøv å kjøre hver subselect for seg, og hovedspørringen uten subselects for å isolere problemet.

 

Og ... nå vet ikke jeg hvordan skjemaet ditt ser ut, men jeg ville prøvd å bytte ut

 

SUM(`ankkolli`) as `ankkolli`,

 

med

 

SUM(`antkolli`) as `antkolli`,

 

kanskje?

Endret av quantum
Lenke til kommentar
Du har vel ikke så gammel versjon av mysql at subselects ikke støttes?

 

Prøver å kjøre en tilsvarende spørring på min versjon 5.et.eller.annet og det funker ihvertfall der.

 

Ser heller ikke noe feil i spørringen. Prøv å kjøre hver subselect for seg, og hovedspørringen uten subselects for å isolere problemet.

 

Og ... nå vet ikke jeg hvordan skjemaet ditt ser ut, men jeg ville prøvd å bytte ut

 

SUM(`ankkolli`) as `ankkolli`,

 

med

 

SUM(`antkolli`) as `antkolli`,

 

kanskje?

 

Takk for raskt svar.

 

Testet hver av subselectene hver for seg i phpmyadmin og disse fungerte. Det samme gjorde spørringen uten subselectene (SUM funksjonene).

 

Jeg har siden hostet på Servage og på en MySQL v.4, kan det da være at mySQL v.4 ikke støtter subselects?

Lenke til kommentar
Jeg har siden hostet på Servage og på en MySQL v.4, kan det da være at mySQL v.4 ikke støtter subselects?

 

Tror det kommer an på hvilken 4-versjon du har. Du får lese manualen og se om du blir klokere ... http://dev.mysql.com/doc/refman/4.1/en/sub...strictions.html ... vær obs på hva som gjelder for hvilken versjon.

 

Det fins andre alternativer som ikke har et så sinnsykt rotete forhold til SQL-standarden.

 

PS, 4.1 og senere støtter subqueries, ref http://dev.mysql.com/doc/refman/4.1/en/subqueries.html

Endret av quantum
Lenke til kommentar

Hei, jeg har tenkt på å endre denne spørringen slik at jeg ikke har subselect, men lurer på hva som egentlig er letteste og beste måten å gjøre det på¨.

 

Må jeg kjøre en sql spørring på hver av disse select statmentene og kjøre hovedspørringen med SUM funksjonene? Eller er det en annen måte å få kjørt alt i en?

Lenke til kommentar
Kan du illustrere hvordan ønsket resultat ser ut? Lettere å gi tips da.

Ja, kan jo prøve det. Kan ikke komme med noen screenshot fra, men den sql spørringen da henter ut informasjonen som endel bedrifter har lagt inn i systemet.

 

Dette skal vi som jobber med dette få ut i tabellform, en bedrift pr rad (øverste rad er selvfølgelig overskriften til hver kollone).

 

Så er hver kollonene representert en for logistikk, hvor det da kommer opp enten Ja eller Nei og det er summert opp antall stoler etc.

 

Bedriftnavnet er da også en link til som gjør at det blir utført enda en spørring for å få opp detaljert info om denne bedrifte. Det er ikke noe jeg trenger hjelp til da.

 

Var dette greit å forstå?

Lenke til kommentar

Versjonen er 4.0.26.

 

Men i og med at jeg har testet alle subselectene for seg og det som står igjen når de er tatt bort, og det fungerte, så lurer jeg på om noen har en annen måte å få ut dette på, uten å slippe å kjøre alle hver for seg...

 

Vet ikke om det er en annen mulighet, men jeg håper...

Lenke til kommentar
Vet ikke om det er en annen mulighet, men jeg håper...

 

select sum(c1.rektbord) as rektbord

, sum(c1.stolar) as stolar

, sum(c1.struttak) as struttak

, sum(c1.antmiddag) as antmiddag

, count(c2.transporthjelp) as transporthjelp

, count(c3.logistikk) as logistikk

from contents c1

left join contents c2 on c1.id = c2.id and c2.transporthjelp = 'J'

left join contents c3 on c1.id = c3.id and c3.logistikk = 'J'

osv ...

 

Dette er også en lettere spørring for databasen mht. optimalisering, men kanskje ikke like intuitivt å lese og skrive ... pleier å bruke subselects selv, så dersom noen har noe å sette finger'n på så fyr løs. Dersom det hadde vært en where-betingese på den ytterste select'en, hadde jo denne spørringen feilet. Men det kunne kanskje vært løst med left outer join? Eller?

Endret av quantum
Lenke til kommentar

Dette vil ikke fungere quantum, du vil få stolar*struttak*antmiddag*transporthjelp*logistikk antall rader og så en sum av disse...

 

Framgangsmåten til trådstarter er riktig, men tydligvis ikke mulig i mysql 4.0. Løsningen er å kjøre en spørring pr sum du skal ha ut. Burde ikke bli så mye mer last på serveren, bare utrolig mye mer klønete kode.

Lenke til kommentar
Dette vil ikke fungere quantum, du vil få stolar*struttak*antmiddag*transporthjelp*logistikk antall rader og så en sum av disse...

 

Framgangsmåten til trådstarter er riktig, men tydligvis ikke mulig i mysql 4.0. Løsningen er å kjøre en spørring pr sum du skal ha ut. Burde ikke bli så mye mer last på serveren, bare utrolig mye mer klønete kode.

 

Tjaaaa, hvorfor vil det ikke funke?

 

Lagde meg en enkel test med noen få data fra en litt større tabell jeg hadde for hånden:

 

select sum(knr) as sumknr
, (select count(prepInnenbordsAnt) from test where prepInnenbords) as prepIn
, (select count(owiid) from test where owiid > 50) as bigowii
from test

union all

select sum(t1.knr) as sumknr, count(t2.prepInnenbordsAnt) as prepIn, count(t3.owiid)
from test t1 
left join test t2 on (t1.owiid = t2.owiid and t2.prepInnenbords)
left join test t3 on (t1.owiid = t3.owiid and t3.owiid > 50)

 

Her får man to identiske rader (gitt mine data vel å merke, men det er ikke noe spesielt magisk med dem tror jeg), s.a. omskrivingen fra subselects til joins ser ut til å funke. Hvorfor skulle ikke samme metode funke for TS? Som sagt måtte man justere joiningen dersom hovedspørringen hadde hatt where-betingelse, men det har den jo ikke i TS tilfelle.

Endret av quantum
Lenke til kommentar

Hvis du har fem tabeller med 100 rader hver og joiner disse sammen (litt forenklet)

 

SELECT *

FROM A, B, C, D, E

 

så får du 100*100*100*100*100 rader, dvs 10.000.000.000 rader, ikke akkurat optimalt og du får feil summer...

 

Selvfølgelig går dette greit hvis du joiner på en slik måte at du kun får en rad før du hiver på aggregater, men da er det heller ingen grunn til å bruke aggregater.

Lenke til kommentar
Hvis du har fem tabeller med 100 rader hver og joiner disse sammen (litt forenklet)

 

SELECT *

FROM A, B, C, D, E

 

så får du 100*100*100*100*100 rader, dvs 10.000.000.000 rader, ikke akkurat optimalt og du får feil summer...

 

Selvfølgelig går dette greit hvis du joiner på en slik måte at du kun får en rad før du hiver på aggregater, men da er det heller ingen grunn til å bruke aggregater.

 

Akkurat hva dine summer blir legger jeg meg ikke oppi, men mine summer og count'er ble pussig nok akkurat de samme med subselects som med joins, og såvidt jeg kan se er det ikke noe med TS' opprinnelige spørring som skulle tilsi at ikke akkurat samme omskrivningsmetode kan brukes. Men det kan kanskje du?

 

La oss ta denne da

 

select t1.knr as knr1, t2.knr as knr2, t3.knr as knr3
from test t1 
left join test t2 on (t1.owiid = t2.owiid and t2.prepInnenbords)
left join test t3 on (t1.owiid = t3.owiid and t3.owiid > 50)

 

Tabellen jeg bruker har 469 rader, hvor mange rader blir det i resultatet fra denne spørringen tror du?

 

En annen ting er at denne databasen kanskje burde oppgraderes snart ...

Endret av quantum
Lenke til kommentar
Hvis du har fem tabeller med 100 rader hver og joiner disse sammen (litt forenklet)

 

SELECT *

FROM A, B, C, D, E

 

så får du 100*100*100*100*100 rader, dvs 10.000.000.000 rader, ikke akkurat optimalt og du får feil summer...

 

Selvfølgelig går dette greit hvis du joiner på en slik måte at du kun får en rad før du hiver på aggregater, men da er det heller ingen grunn til å bruke aggregater.

 

Akkurat hva dine summer blir legger jeg meg ikke oppi, men mine summer og count'er ble pussig nok akkurat de samme med subselects som med joins, og såvidt jeg kan se er det ikke noe med TS' opprinnelige spørring som skulle tilsi at ikke akkurat samme omskrivningsmetode kan brukes. Men det kan kanskje du?

 

La oss ta denne da

 

select t1.knr as knr1, t2.knr as knr2, t3.knr as knr3
from test t1 
left join test t2 on (t1.owiid = t2.owiid and t2.prepInnenbords)
left join test t3 on (t1.owiid = t3.owiid and t3.owiid > 50)

 

Tabellen jeg bruker har 469 rader, hvor mange rader blir det i resultatet fra denne spørringen tror du?

 

En annen ting er at denne databasen kanskje burde oppgraderes snart ...

 

Takk for svar.

 

Jeg har ikke så mange rader...

 

Jeg opprettet databasen rett før servage.net kom med v.5... Så har planlagt å oppgradere, men det er noe jeg ikke får gjort før i slutten av januar. Må ha alt oppe å gå frem til da...

Lenke til kommentar
Takk for svar.

 

Jeg har ikke så mange rader...

 

Jeg opprettet databasen rett før servage.net kom med v.5... Så har planlagt å oppgradere, men det er noe jeg ikke får gjort før i slutten av januar. Må ha alt oppe å gå frem til da...

Hehe, beklager at jeg og blackbrrrd har kuppa tråden din litt. Får du til spørringen din?

Lenke til kommentar
Takk for svar.

 

Jeg har ikke så mange rader...

 

Jeg opprettet databasen rett før servage.net kom med v.5... Så har planlagt å oppgradere, men det er noe jeg ikke får gjort før i slutten av januar. Må ha alt oppe å gå frem til da...

Hehe, beklager at jeg og blackbrrrd har kuppa tråden din litt. Får du til spørringen din?

Det går bra.

Jeg fikk til en spørring som fungerer.

Lenke til kommentar
Flott!

 

Kan du legge ut spørringen til glede for leserene siden det er så mange som har engasjert seg? Jeg gjør det til en god vane å legge ut løsningen når jeg spør etter hjelp.

 

Beklager at jeg ikke fikk tid til å hjelpe deg.

 

Først, så fant jeg ut at denne tabellen min var såpass enkel, at jeg bare kjørt countene og sumene i en SQL spørring. Det ga et svar på det viktigste som var sumene.

 

Men så fant jeg heller ut at jeg skulle bytte til mySql v5 i stedet. Så fikk jeg gjort det på kvelden i og med at brukerene er bedrifter og studenter og mest på dagtid...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...