[mysql] Subquery geeft Syntax error

Pagina: 1
Acties:
  • 241 views sinds 30-01-2008
  • Reageer

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
Hallo tweakers,

Ik ben sinds bepaalde tijd mijn website aan het herschrijven (optimaliseren ed.)

Voor mijn weblog haal ik dus alles op uit de database, ik stap dan door de array heen, en voor ieder item voer ik dan nog eens een query uit om het aantal reacties te tellen.

Nu, ik weet, dit is verre van efficient, want doe dat maar eens bij 20, 30, 40 weblogitems.

Daarom probeer ik dus 1 query uit te voeren: samen met het weblog op te halen, ook de reacties erbij tellen.

Mijn probleem:
De query werkt niet.

Mijn vraag:
Wat is er fout aan de query?

De query
SQL:
1
2
3
4
5
6
7
8
9
SELECT
    id,
    datum,
    titel,
    tekst,
    (COUNT (*) FROM commentaar WHERE weblog.id = commentaar.weblogid) AS reactie
FROM 
    weblog,
    commentaar


De error:
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 '*) FROM COMMENTAAR WHERE weblog.id = commentaar.weblogid) AS reactie
FROM
we' at line 6
Wat heb ik geprobeerd:Extra info:
  • 2 tabellen, weblog (id, datum, titel, tekst) en commentaar (id, datum, naam, reactie, weblogid)
  • commentaar.weblogid verwijst telkens naar het bijhorend weblogitem
  • Mysql 5.0.18 @ Windows XP, SP2
Ik hoop dat dit genoeg info is.

Going for adventure, lots of sun and a convertible! | GMT-8


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Een subquery moet je als 'hele' query schrijven, dus ook het woord 'SELECT' erbij :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
P_de_B schreef op zondag 12 maart 2006 @ 15:53:
Een subquery moet je als 'hele' query schrijven, dus ook het woord 'SELECT' erbij :)
SQL:
1
COUNT (*) FROM commentaar


is een volledige query?

Hoe moet ik daar nog een SELECT bij doen?

[ Voor 6% gewijzigd door Snake op 12-03-2006 15:58 ]

Going for adventure, lots of sun and a convertible! | GMT-8


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Je hebt ook geen subqueries nodig hiervoor:

SQL:
1
2
3
4
SELECT   id, datum, titel, tekst, COUNT(commentaar.weblogid) AS reacties
FROM     weblog, commentaar
WHERE    weblog.id = commentaar.weblogid
GROUP BY id, datum, titel, tekst

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 21:54
Neen, het is geen volledige query, want je moet aangeven dat je wat SELECTEN.

Het moet dus zijn
SQL:
1
SELECT COUNT(*) FROM commentaar


omdat count alleen een functie is op de rows die je terugkrijgt. Je database heeft geen idee wat er vervolgens mee moet gebeuren: insert? update? select?

[ Voor 13% gewijzigd door Mithrandir op 12-03-2006 16:01 ]

Verbouwing


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Op de manualpage die je zelf aanhaalt staat letterlijk hoe het wel moet en wat je fout doet in jouw subquery. Sowieso zijn syntaxfouten altijd het resultaat van tik- of denkfouten en dus per definitie perfect met de manual op te lossen.

Edit: en weer open, het probleem lijkt toch ergens anders te zitten. :)

[ Voor 14% gewijzigd door NMe op 12-03-2006 16:45 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
-NMe- schreef op zondag 12 maart 2006 @ 16:06:
Edit: en weer open, het probleem lijkt toch ergens anders te zitten. :)
Danku
[ti] schreef op zondag 12 maart 2006 @ 15:59:
Je hebt ook geen subqueries nodig hiervoor:
...
Ik heb geprobeerd van dit te doen, maar hij gaf een error dat id bij beide tabbelen werd gebruikt.
Dus heb ik beetje aangepast (en het werkt), maar hij laat dan alleen maar de posts zien waar reacties op gepost zijn. (ik moet ze allemaal hebben!)
SQL:
1
2
3
4
SELECT   weblog.id, weblog.datum, weblog.titel, weblog.tekst, COUNT(commentaar.weblogid) AS reacties
FROM     weblog, commentaar
WHERE    weblog.id = commentaar.weblogid
GROUP BY weblog.id, weblog.datum, weblog.titel, weblog.tekst


Ook heb ik dus geprobeerd 'mijn' query aan te passen met de hulp hier:

SQL:
1
2
3
4
5
6
7
8
9
SELECT
    id,
    datum,
    titel,
    tekst,
    (SELECT COUNT (*) FROM commentaar WHERE weblog.id = commentaar.weblogid) AS reactie
FROM 
    weblog,
    commentaar


Dit werkt niet, volgens -NMe- mag ik dus niets gebruiken van mijn hoofdquery in mijn subquery.
Maar zelfs als ik het gedeelte van
SQL:
6
WHERE weblog.id = commentaar.weblogid
weglaat, dan doet hij het NOG niet.

Zeer gek dus.

Mijn opties:
  • De query van [ti] aanpassen zodat hij ALLES weergeeft.
  • Mijn query aanpassen.

[ Voor 21% gewijzigd door Snake op 12-03-2006 17:01 ]

Going for adventure, lots of sun and a convertible! | GMT-8


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 22:01

The Eagle

I wear my sunglasses at night

Probeer anders eens met aliassen voor je tabellen te werken. Dan weet je wat zekerder dat de parser zich niet kan verslikken :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • geenstijl
  • Registratie: Juli 2005
  • Niet online
SQL:
1
2
3
4
5
6
7
8
SELECT
  weblog.id,
  weblog.datum,
  weblog.titel,
  weblog.tekst
  (SELECT COUNT(commentaar.weblogid) FROM commentaar WHERE commentaar.weblogid = weblog.weblogid) AS reactie
FROM
  weblog


De fout zit hem mijn inziens in COUNT(*), specificeer daarin een kolom en het werkt wel.

[ Voor 19% gewijzigd door geenstijl op 12-03-2006 17:24 ]


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
geenstijl schreef op zondag 12 maart 2006 @ 17:23:
SQL:
1
2
3
4
5
6
7
8
SELECT
  weblog.id,
  weblog.datum,
  weblog.titel,
  weblog.tekst
  (SELECT COUNT(commentaar.weblogid) FROM commentaar WHERE commentaar.weblogid = weblog.weblogid) AS reactie
FROM
  weblog


De fout zit hem mijn inziens in COUNT(*), specificeer daarin een kolom en het werkt wel.
Ja!!!

Dank U

Het werkt :) _/-\o_ _/-\o_

Mijn query dus: (al uitgebreid)

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
  weblog.id,
  weblog.datum,
  weblog.titel,
  weblog.tekst,
  (SELECT COUNT(commentaar.weblogid) FROM commentaar WHERE commentaar.weblogid = weblog.id) AS reactie
FROM
  weblog
ORDER BY
  id DESC


Ik ben dus op zoek gegaan naar het 'probleem', met de oplossing bij de hand is dat dus veel makkelijker :)

Wat blijkt:
  • weblog.id = commentaar.weblogid moest omgedraaid worden
  • tussen COUNT en (*) mag geen spatie staan (?)
Ik weet dat we op GoT niet groeten, maar Dankuwel mag ik toch wel zeggen zeker :)

Bij deze: Dank U! _/-\o_

Going for adventure, lots of sun and a convertible! | GMT-8


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Toch nog even een aanvulling, het kan ook zonder subquery. Afhankelijk van de database kan dat een stuk sneller zijn:

SQL:
1
2
3
4
SELECT weblog.id, weblog.datum, weblog.tekst, COUNT(commentaar.id) as AantalReacties
FROM weblog
LEFT OUTER JOIN commentaar on weblog.id = commentaar.weblogid
GROUP BY weblog.id, weblog.datum, weblog.tekst


Let op de left outer join, je krijgt dan dus ook weblog records terug waarop nog geen commentaar is gegeven. De join methode die hierboven is gebruikt (waarbij de join criteria in de where-clausule staan) is eigenlijk een inner join je krijgt dus alleen rijen terug die in beide tabellen staan.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1