Toon posts:

[MySQL] waarom "error in SQL syntax" bij v4 en niet bij v5

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb op een lokaal systeem een applicatie ontwikkeld die gebruikt maak van MySQL versie 5.0.0 Alles werkte prima maar nu is deze applicatie zojuist bij de hosting provider op de server geplaats en krijg ik de volgende 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 'SELECT g.voornaam FROM gebruiker g WHERE g.gebruiker_id = c.geb"

Er zit geen fout in de syntax aangezien het op v 5 gewoon werkt. Maar bij de provider wordt nog gebruik gemaakt van MySQL 4.0.15. Schijnbaar staat er iets in dit script waar v 4. niet mee om kan gaan.

Kunnen jullie mij s.v.p. vertellen wat dit precies is?
Hierbij de SQL:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT
    c.*,            
    (SELECT g.voornaam FROM gebruiker g WHERE g.gebruiker_id = c.gebruiker_id) AS voornaam,
    (SELECT g.achternaam FROM gebruiker g WHERE g.gebruiker_id = c.gebruiker_id) AS achternaam,
    (SELECT COUNT(*) FROM calls_callstatus s WHERE s.call_id=c.call_id AND callstatus_id > 60) AS status
FROM 
    calls c
WHERE
    c.datum < 1105311601 AND c.call_id != 0
ORDER BY
    status,c.classificatie DESC, c.datum


Bedankt voor de hulp _/-\o_

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 01-03 18:17
MySQL 4 ondersteunt deze query niet... Misschien werkt hij in 4.1 wel, maar versie 4 houdt niet van subqueries en dit soort ingewikkelde constructies ;)

[ Voor 62% gewijzigd door ludo op 09-01-2005 21:26 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Waarom doe je dit zo ingewikkeld :?

Je kunt volgens mij een gewone join gebruiken.

SELECT
FROM
INNER JOIN anderetabel ON [..] = [..]

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


Verwijderd

Topicstarter
P_de_B schreef op zondag 09 januari 2005 @ 21:26:
Waarom doe je dit zo ingewikkeld :?

Je kunt volgens mij een gewone join gebruiken.

SELECT
FROM
INNER JOIN anderetabel ON [..] = [..]
Omdat ik anders geen resultaat van de tabel "calls" terug krijg indien het resultaat van"(SELECT COUNT(*) FROM calls_callstatus s WHERE s.call_id=c.call_id AND callstatus_id > 60)" lager dan 1 is.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Weet je zeker dat je geen group by kunt gebruiken?

P&W FAQ - SQL

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


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 13-05 20:39
Je maakt gebruik van subqueries en deze zitten er in gebakken van af versie 4.1 en hoger.

Verwijderd

Topicstarter
Tot zo ver kan ik het probleem nog oplossen met left joins.
Zo'n left join kan ik echter niet gebruiken voor "(SELECT COUNT(*) FROM calls_callstatus s WHERE s.call_id=c.call_id AND callstatus_id > 60) AS status".

code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    c.*,            
    g.voornaam AS voornaam,
    g.achternaam AS achternaam,
    (SELECT COUNT(*) FROM calls_callstatus s WHERE s.call_id=c.call_id AND callstatus_id > 60) AS status
FROM 
    calls c
    LEFT JOIN gebruiker g ON(g.gebruiker_id = c.gebruiker_id)
WHERE
    c.datum < 1105311601 AND c.call_id != 0
ORDER BY
    status,c.classificatie DESC, c.datum


Heeft iemand een goede oplossing hiervoor?

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Probeer het zo eens
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    c.*,            
    g.voornaam AS voornaam,
    g.achternaam AS achternaam,
    COUNT(*) AS status
FROM 
    calls c
    LEFT JOIN gebruiker g ON(g.gebruiker_id = c.gebruiker_id),
        calls_callstatus s
WHERE
    c.datum < 1105311601 AND c.call_id != 0 AND
        s.call_id = c.call_id AND
        callstatus_id > 60
GROUP BY
       c.*, voornaam, achternaam
ORDER BY
    status,c.classificatie DESC, c.datum


Wellicht moet je die c.* geheel specificeren dat weet ik niet (sowieso is dat handig om te doen voor het overzicht imo)

Verwijderd

Topicstarter
Erkens schreef op zondag 09 januari 2005 @ 22:23:
Probeer het zo eens
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    c.*,            
    g.voornaam AS voornaam,
    g.achternaam AS achternaam,
    COUNT(*) AS status
FROM 
    calls c
    LEFT JOIN gebruiker g ON(g.gebruiker_id = c.gebruiker_id),
        calls_callstatus s
WHERE
    c.datum < 1105311601 AND c.call_id != 0 AND
        s.call_id = c.call_id AND
        callstatus_id > 60
GROUP BY
       c.*, voornaam, achternaam
ORDER BY
    status,c.classificatie DESC, c.datum


Wellicht moet je die c.* geheel specificeren dat weet ik niet (sowieso is dat handig om te doen voor het overzicht imo)
Dat werkt zelfs op 5.0 niet:

"#1064 - 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 '* , voornaam, achternaam
ORDER BY
STATUS , c.classificatie DE"

Het resultaat van calls mag niet afhankelijk zijn het aantal van "calls_callstatus"

De "call" moet ook weergeven worden als er 0 regels zijn gevonden in de tabel "calls_callstatus"

[ Voor 11% gewijzigd door Verwijderd op 09-01-2005 22:33 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op zondag 09 januari 2005 @ 22:29:
[...]


Dat werkt zelfs op 5.0 niet:

#1064 - 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 '* , voornaam, achternaam
ORDER BY
STATUS , c.classificatie DE
lees jij dat laatste zinnetje van mijn post nog eens ;)

Verwijderd

Topicstarter
Erkens schreef op zondag 09 januari 2005 @ 22:32:
[...]

lees jij dat laatste zinnetje van mijn post nog eens ;)
Als ik de kolomnamen opgeef ipv c.* krijg ik idd resultaten, echter:

Het resultaat van calls mag niet afhankelijk zijn het aantal van "calls_callstatus"
De "call" moet ook weergeven worden als er 0 regels zijn gevonden in de tabel "calls_callstatus"

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op zondag 09 januari 2005 @ 22:35:
[...]


Als ik de kolomnamen opgeef ipv c.* krijg ik idd resultaten, echter:

Het resultaat van calls mag niet afhankelijk zijn het aantal van "calls_callstatus"
De "call" moet ook weergeven worden als er 0 regels zijn gevonden in de tabel "calls_callstatus"
nu heb ik hier natuurlijk niet zo'n database om het een en ander te testen, maar met een left join is dit wel op te lossen, het enige probleem is dan dat er bij 0 results in die calls_callstatus dan alsnog een count heeft van 1 row.
Dit "probleem" had ik zelf ook vanmiddag met een applicatie en dat heb ik dan maar in de applicatie opgelost door tevens een extra veld uit die table te nemen (in jouw geval een veld uit calls_callstatus.call_id) welke op NULL staat op het moment dat die geen results heeft,

Verwijderd

Topicstarter
Erkens schreef op zondag 09 januari 2005 @ 22:41:
[...]

nu heb ik hier natuurlijk niet zo'n database om het een en ander te testen, maar met een left join is dit wel op te lossen, het enige probleem is dan dat er bij 0 results in die calls_callstatus dan alsnog een count heeft van 1 row.
Dit "probleem" had ik zelf ook vanmiddag met een applicatie en dat heb ik dan maar in de applicatie opgelost door tevens een extra veld uit die table te nemen (in jouw geval een veld uit calls_callstatus.call_id) welke op NULL staat op het moment dat die geen results heeft,
Dat gaat hier niet op, helaas.

Ik moet toch een andere oplossing hebben

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op zondag 09 januari 2005 @ 23:17:
[...]


Dat gaat hier niet op, helaas.

Ik moet toch een andere oplossing hebben
je zegt dat je zelf een applicatie ontwikkeld hebt, dan is een kleine aanpassing (if veld==null then status=0) toch geen probleem lijkt me :?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:31

Creepy

Tactical Espionage Splatterer

Erkens schreef op zondag 09 januari 2005 @ 23:19:
[...]

je zegt dat je zelf een applicatie ontwikkeld hebt, dan is een kleine aanpassing (if veld==null then status=0) toch geen probleem lijkt me :?
Lijkt me ook geen probleem nee. Daarnaast is het algemeen bekend dat subqueries niet werken in MySQL 4.0.
Raar verhaal ook dat als je weet dat je hoster 4.0 draait je toch op 5.0 gaat testen en je je eigen app niet meer kunt aanpassen? ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1