[SQL] Subquery werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • AmotaX
  • Registratie: Juli 2004
  • Laatst online: 20-07 22:24

AmotaX

Developer

Topicstarter
Hallo,

Ik probeer een subquery te maken met SQL, maar kom er niet uit. Ik werk met PHP en MySQL.
Het is een fictief project waar we een database aangeleverd hebben gekregen van de website Funda.
Ik heb een formulier waarmee ik moet kunnen zoeken naar huizen binnen een bepaalde postcode of plaats en de minimum- en maximum-verkoopprijs.
De volgende query werkt wel:
SQL:
1
2
3
4
SELECT WOID FROM wo
WHERE PC LIKE '$q'
OR City LIKE '$q'
LIMIT 15;

Dit staat in php tussen "" dus bij '$q' wordt de zoek-string neergezet door middel van deze code:
PHP:
1
$q = '%'.mysql_real_escape_string($_REQUEST['q']).'%';


So far so good. Maar ik wou eigenlijk zoiets maken:
SQL:
1
2
3
4
5
6
SELECT * FROM wo
WHERE WOID = (SELECT WOID FROM wo
                WHERE PC LIKE '$q' 
                OR City LIKE '$q')
AND Vraagprijs > $min 
AND Vraagprijs < $max;

Maar dit werkt dus niet. Dus ik dacht laat ik eerst een simpele subquery maken zoals dit:
SQL:
1
2
3
4
5
SELECT * FROM wo
WHERE WOID = (SELECT WOID FROM wo
                WHERE PC LIKE '$q'
                OR City LIKE '$q'
                LIMIT 15);


Maar dit werkt dus ook al niet en ik kom er niet meer uit.
Kan iemand mij alstublieft verder helpen!?

Acties:
  • 0 Henk 'm!

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 11-09 16:00

Skinny

DIRECT!

Ik gok dat de foutmelding die je krijgt toch wel enigszins verhelderend moet zijn. Mijn glazen bol zegt iets met multiple results in sub query.. (althans zo heet het in MSSQL ;-) )

De subquery die je gebruikt levert waarschijnlijk meerdere resultaten op.

code:
1
WHERE WOID=('Amsterdam','Almere','Abcoude')


gaat dus niet werken

code:
1
WHERE WOID IN ('Amsterdam','Almere','Abcoude')


wel.

zie ook http://dev.mysql.com/doc/...y-in-some-subqueries.html

[ Voor 6% gewijzigd door Skinny op 28-03-2011 19:50 ]

SIZE does matter.
"You're go at throttle up!"


Acties:
  • 0 Henk 'm!

  • AmotaX
  • Registratie: Juli 2004
  • Laatst online: 20-07 22:24

AmotaX

Developer

Topicstarter
Bedankt voor je reactie, maar ik krijg geen foutmelding. Ik krijg gewoon helemaal geen resultaten.
En het is juist wel de bedoeling dat ik meerdere resultaten terug krijg.
Ik gebruik het volgende om de resultaten weer te geven:
PHP:
1
2
3
4
5
6
7
8
9
10
// run query
$result = mysql_query($query);

// use result (if there is any)
if($result){
    while($row = mysql_fetch_assoc($result)){
        echo $row['WOID'];
        echo '<br/>';
    }
}


Ik heb ook de = veranderd in IN zoals het hieronder staat:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT * FROM wo
WHERE WOID IN (SELECT WOID FROM wo
                WHERE PC LIKE '$q'
                OR City LIKE '$q'
                LIMIT 15);

// WOID weglaten bij de WHERE werkt ook niet
SELECT * FROM wo
WHERE IN (SELECT WOID FROM wo
                WHERE PC LIKE '$q'
                OR City LIKE '$q'
                LIMIT 15);

Maar dit veranderd niks. (In ieder geval niet dat ik kan zien, ook geen foutmelding)

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
welkom bij mysql ;)
ding accepteerd alles maar komt vervolgens met vreemde foute of geen resultaten

skinny heeft wel gelijk. Het moet 'in' zijn ipv '='

wat voor zin heeft die subquery in jouw geval?

Verder staat dit gewoon in de manual:
http://dev.mysql.com/doc/refman/5.0/en/select.html

[ Voor 9% gewijzigd door BasieP op 28-03-2011 20:09 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • AmotaX
  • Registratie: Juli 2004
  • Laatst online: 20-07 22:24

AmotaX

Developer

Topicstarter
Deze query heeft zoals hij er nu staat niet veel zin, alleen maar om te testen of mijn gebruik van subqueries goed was.

Ik heb wel eerder met subqueries gewerkt en gebruik dit ook als referentie, maar dit was met een Access database en meerdere tabellen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
--Find out how many employees are managed by "James Adam".
SELECT COUNT(*)-1 AS NumberOfEmployees
   FROM Employee E INNER JOIN Department D
   ON E.deptNo = D.deptNo
   WHERE E.deptNo = (SELECT D.deptNo
      FROM Department D INNER JOIN Employee E
      ON D.mgrEmpNo = E.empNo
      WHERE E.empNo = (SELECT E.empNo
         FROM Employee E
         WHERE E.fName = 'James'
         AND E.lName = 'Adam'));

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
AmotaX schreef op maandag 28 maart 2011 @ 19:42:
SQL:
1
2
3
4
5
6
SELECT * FROM wo
WHERE WOID = (SELECT WOID FROM wo
                WHERE PC LIKE '$q' 
                OR City LIKE '$q')
AND Vraagprijs > $min 
AND Vraagprijs < $max;
Is daar een speciale reden voor? Zoals het er nu staat kan dit simpel en sneller zonder subquery. Dit is niet de gehele query neem ik dan (voorzichtig) aan?
Maar dit werkt dus niet. Dus ik dacht laat ik eerst een simpele subquery maken zoals dit:
SQL:
1
2
3
4
5
SELECT * FROM wo 
WHERE WOID IN (SELECT WOID FROM wo 
                WHERE PC LIKE '$q' 
                OR City LIKE '$q' 
                LIMIT 15);
Werkt het volgende wel?:
SQL:
1
2
3
4
SELECT * FROM wo 
WHERE WOID IN (SELECT WOID FROM wo 
                WHERE PC LIKE '$q' 
                OR City LIKE '$q' );


http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html
Ik zie niet onmiddellijk of het bij alle versies is maar de eerste error geeft al een indicatie in welke richting je zou kunnen zoeken.

Edit:
AmotaX schreef op maandag 28 maart 2011 @ 20:04:
Bedankt voor je reactie, maar ik krijg geen foutmelding. Ik krijg gewoon helemaal geen resultaten.
En het is juist wel de bedoeling dat ik meerdere resultaten terug krijg.
Ik gebruik het volgende om de resultaten weer te geven:
PHP:
1
2
3
4
5
6
7
8
9
10
// run query
$result = mysql_query($query);

// use result (if there is any)
if($result){
    while($row = mysql_fetch_assoc($result)){
        echo $row['WOID'];
        echo '<br/>';
    }
}
Ga je wel de error tonen? In je code doe je dat namelijk niet. Die query gaat namelijk gewoon uitgevoerd worden, sqlerror of niet. Dus die if een else geven met een "echo mysql_error()" Of:
PHP:
1
$result = mysql_query($query) or die($query . "<br />" . mysql_error());

[ Voor 27% gewijzigd door kluyze op 28-03-2011 20:27 ]


Acties:
  • 0 Henk 'm!

  • AmotaX
  • Registratie: Juli 2004
  • Laatst online: 20-07 22:24

AmotaX

Developer

Topicstarter
Bedankt mensen! Het werkt nu wel door middel van deze query:
SQL:
1
2
3
4
5
6
7
SELECT * FROM wo
WHERE WOID IN (SELECT WOID FROM wo
                WHERE PC LIKE '$q' 
                OR City LIKE '$q')
AND Vraagprijs > $min 
AND Vraagprijs < $max
LIMIT 15;


En "kluyze" hoe zou ik deze query makkelijker/sneller kunnen maken dan?

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Zoiets:
SQL:
1
2
3
4
5
6
SELECT * FROM wo
WHERE
( PC LIKE '$q' OR City LIKE '$q')
AND Vraagprijs > $min 
AND Vraagprijs < $max
LIMIT 15;
?

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 00:41

The Eagle

I wear my sunglasses at night

Als je denkt dat het aan je query ligt, test heb dan eerst even in mysql zelf ipv je PHP stukje. Ik zie zovaak dingen fout gaan doordat het aanroepende stuk niet goed geprogrammeerd is, dat wil je niet weten.

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


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
AmotaX schreef op maandag 28 maart 2011 @ 20:27:
Bedankt mensen! Het werkt nu wel door middel van deze query:
SQL:
1
2
3
4
5
6
7
SELECT * FROM wo
WHERE WOID IN (SELECT WOID FROM wo
                WHERE PC LIKE '$q' 
                OR City LIKE '$q')
AND Vraagprijs > $min 
AND Vraagprijs < $max
LIMIT 15;


En "kluyze" hoe zou ik deze query makkelijker/sneller kunnen maken dan?
Je maakt hier 2 queries naar dezelfde tabel, dat kan natuurlijk makkelijker zoals Kluyze laat zien door een extra restrictie op de bestaande tabel.

Mocht die WOID in een andere tabel staan, dan is een Subquery misschien handig, hier is hij overbodig.
Pagina: 1