Unknown column 't1.id' in 'where clause' Bij meerder tabellen in 1 query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan Erik Van woerden

Jan Erik Van woerden

11/08/2010 16:46:53
Quote Anchor link
Hallo,

Ik heb een probleem met MySQLi
Bij de volgende query krijg ik deze fout:
Unknown column 't1.id' in 'where clause'

Weet iemand hier een oplossing op?

De code: (Connectie heb ik weggelaten en andere queries werken gewoon goed)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if($db->connect_errno)
{

    echo $db->connect_error;
}


$query = $db->query("SELECT * FROM `users` AS `t1`, `userParams` AS `t2` WHERE `t1.id` = '1'") or die($db->error);
echo $query->num_rows;

while($row = $query->fetch_object())
{

    print_r($row);
}

?>
 
PHP hulp

PHP hulp

19/04/2024 20:18:01
 
John D

John D

11/08/2010 16:51:03
Quote Anchor link
Haal de ` (quootjes) weg in de MySQL string.
 
- Mark -

- Mark -

11/08/2010 16:51:06
Quote Anchor link
het id zal wel een integer zijn? dan moet je de '' om de 1 weg halen. Sloop de backtics er ook maar uit als je dan toch bezig bent. Die zijn niet nodig.
 
John D

John D

11/08/2010 16:52:38
Quote Anchor link
Mark Coenen op 11/08/2010 16:51:06:
het id zal wel een integer zijn? dan moet je de '' om de 1 weg halen. Sloop de backtics er ook maar uit als je dan toch bezig bent. Die zijn niet nodig.

Als het id wel bestaat maar van een ander datatype is (integer??) dan krijg je geen UNKNOWN Column foutmelding maar een melding dat de datatypes niet matchen.
Gewijzigd op 11/08/2010 16:55:22 door John D
 
Jan Erik Van woerden

Jan Erik Van woerden

11/08/2010 16:54:07
Quote Anchor link
Bedankt. Nu werkt het wel :)
Ik ben gewend om met de "`" te werken maar ik denk dat ik dat maar niet moet doen.
 
Joren de Wit

Joren de Wit

11/08/2010 17:06:27
Quote Anchor link
Nee, dat kun je inderdaad beter niet doen. Die backticks (zo heten die dingen) gebruik MySQL om gereserveerde woorden als tabelnaam te kunnen gebruiken. Maar die woorden zijn niet voor niets gereserveerd en daar wil je je dus echt niet aan wagen. Problemen met queries liggen dan zeker op de loer!

ps. En aangezien jij ze niet meer gebruikt voor dat soort tabelnamen, heb je ze in je gewone queries ook niet meer nodig :-)
Gewijzigd op 11/08/2010 17:07:04 door Joren de Wit
 
Jan Erik Van woerden

Jan Erik Van woerden

11/08/2010 17:10:16
Quote Anchor link
Ok, bedankt ik zal het onthouden :)
 
Ferry d

ferry d

17/09/2010 20:41:16
Quote Anchor link
Probeer dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$db->query("SELECT * FROM `users` AS 't1', `userParams` AS 't2' WHERE `t1`.`id` = '1'") or die($db->error);
 

17/09/2010 20:49:57
Quote Anchor link
Ferry d op 17/09/2010 20:41:16:
Probeer dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$db->query("SELECT * FROM `users` AS 't1', `userParams` AS 't2' WHERE `t1`.`id` = '1'") or die($db->error);


Schat, alsjeblieft, please, lees nouw het topic eens door, voordat je post. En kijk eens hoe lang geleden dit al afgerond is...
Verder moet je Blanche's reactie nog eens goed doorlezen.
Ook is het gewoon beter om te selecteren wat je wilt hebben en niet * gebruiken.
 
Niek s

niek s

17/09/2010 21:39:09
Quote Anchor link
Karl Karl op 17/09/2010 20:49:57:
[...]
Ook is het gewoon beter om te selecteren wat je wilt hebben en niet * gebruiken.


"Ja! Maar ik wil ook alles hebben!"

Dan nog is het beter om los iedere kolom naam te specificeren :)
 
Rudie dirkx

rudie dirkx

17/09/2010 23:40:07
Quote Anchor link
Karl Karl op 17/09/2010 20:49:57:
Ook is het gewoon beter om te selecteren wat je wilt hebben en niet * gebruiken.


Is dat wel zo? Volgens mij maakt het namelijk geen zak uit. Het enige dat je met die * meer doet is data ophalen (en geheugen heb je genoeg, behalve als je een heel brede tabel hebt met heel brede kolommen, maar dan ben je gewoon slecht bezig).
Ik definieer NOOIT kolomnamen (alleen als ik 1 kolom van 1 specifieke rij op wil halen).

Heb je een soort van reden of achterliggende gedachte om dat te zeggen? Documentatie? Benchmarks?

Toevoeging op 17/09/2010 23:42:30:

En over die backticks (dat is toch ook al 10 jaar een leuke discussie he!)...
Als je in MySQL een VIEW maakt, gooit ie m vol met backticks (doe maar es SHOW CREATE VIEW blaat;), dus in MySQL zal het wel zin hebben... Als je een geweldige database abstractielaag hebt, gooit die de backticks erin voor je als je MySQL gebruikt en niet als je niet MySQL gebruikt.
 
Richard van Velzen

Richard van Velzen

18/09/2010 00:19:00
Quote Anchor link
Rudie dirkx op 17/09/2010 23:40:07:
Karl Karl op 17/09/2010 20:49:57:
Ook is het gewoon beter om te selecteren wat je wilt hebben en niet * gebruiken.


Is dat wel zo? Volgens mij maakt het namelijk geen zak uit. Het enige dat je met die * meer doet is data ophalen (en geheugen heb je genoeg, behalve als je een heel brede tabel hebt met heel brede kolommen, maar dan ben je gewoon slecht bezig).
Ik definieer NOOIT kolomnamen (alleen als ik 1 kolom van 1 specifieke rij op wil halen).

Heb je een soort van reden of achterliggende gedachte om dat te zeggen? Documentatie? Benchmarks?

Toevoeging op 17/09/2010 23:42:30:

En over die backticks (dat is toch ook al 10 jaar een leuke discussie he!)...
Als je in MySQL een VIEW maakt, gooit ie m vol met backticks (doe maar es SHOW CREATE VIEW blaat;), dus in MySQL zal het wel zin hebben... Als je een geweldige database abstractielaag hebt, gooit die de backticks erin voor je als je MySQL gebruikt en niet als je niet MySQL gebruikt.


Even totaal bezijdens het feit dat als je * vraagt, alle kolommen moeten worden opgezocht in plaats van alleen gecontroleerd dat ze bestaan...

Stel even voor de grap dat ik alle velden uit een bepaalde VIEW selecteer. Ik ga er gewoon van uit dat het allemaal prima werkt. Een collega van me past die VIEW aan, maar omdat ik simpelweg alle velden vraag hoor ik *niks* over dat het resultaat ineens anders is.

Nou, succes met voor al je "SELECT *"-queries tests schrijven om te controleren dat je de goede velden terugkrijgt.

Dit hele probleem heb je totaal niet als je de velden expliciet noemt, verder heb je dan natuurlijk altijd duidelijkheid over wat je selecteert, het *staat* er tenslotte duidelijk. Verder krijg je dan netjes een foutmelding op het moment dat een gek het model verandert.

Denk je nou echt dat al die briljante koppen dit soort dingen voor de lol roepen? Denk eens na, alsjeblieft? Misschien dat jij geen kritieke applicaties draait maar 99.9% van de mensen die ik ken die het wel doen gebruiken nooit *. Het enige waar het voor zorgt is een snelle rit naar verdommenis.
 
Rudie dirkx

rudie dirkx

18/09/2010 00:26:52
Quote Anchor link
Quote:
Even totaal bezijdens het feit dat als je * vraagt, alle kolommen moeten worden opgezocht in plaats van alleen gecontroleerd dat ze bestaan...

Hmm... Controleren of ze bestaan klinkt als: "ze" opzoeken en dan controleren of ze bestaan. En dat klinkt als meer werk dan alleen maar "ze" opzoeken... Mis ik iets?

Quote:
Denk je nou echt dat al die briljante koppen dit soort dingen voor de lol roepen?

Daar vroeg ik dus naar... Welke briljante koppen? Het klinkt wel leuk, maar IS het ook zo? Wie zegt dat? Vind je het heel erg als ik je niet op je woord geloof? We kunnen namelijk wel een schreeuwwedstrijd houden, maar daar verandert niets door.
Zegt MySQL hetzelfde als jij? Ik heb het namelijk nooit kunnen vinden (het is wel al heel lang geleden dat ik ernaar gezocht heb).
 
Richard van Velzen

Richard van Velzen

18/09/2010 00:29:58
Quote Anchor link
Reageer nu even op de andere punten, dat is wat die briljante koppen roepen namelijk.
 
Rudie dirkx

rudie dirkx

18/09/2010 01:20:04
Quote Anchor link
Welke andere punten? En waar staat dat de briljante koppen het roepen?
Klein beetje off topic ook wel he.
Laten we maar zeggen dat:
* backticks evil zijn en
* kolomnamen heerlijk.
 

18/09/2010 12:41:04
Quote Anchor link
Rudie dirkx op 18/09/2010 00:26:52:
Quote:
Even totaal bezijdens het feit dat als je * vraagt, alle kolommen moeten worden opgezocht in plaats van alleen gecontroleerd dat ze bestaan...

Hmm... Controleren of ze bestaan klinkt als: "ze" opzoeken en dan controleren of ze bestaan. En dat klinkt als meer werk dan alleen maar "ze" opzoeken... Mis ik iets?


Het is al een soort van foutcontrole, je moet aangeven welke kolommen je wilt hebben, en die je dus ook verwacht te krijgen. In principe zou de database zo onvriendelijk mogen zijn dat het je maar één kolom terug geeft als je * gebruikt, terwijl je er meer gebruikt. * is namelijk een wildcard. Ook is SQL een self documenting language, door naar de query te kijken snap je dus al wat er gebeurd.
Verder is het eigenlijk altijd zo dat als je SQL op school hebt gebruikt, dat je geen * mag gebruiken. Door * te gebruiken snap je de vraag (query) wellicht niet precies, en geef je verkeerd antwoord op de vraag.
En bovendien, wat moet je met al die extra kolommen? Als je bijvoorbeeld 5 tabellen joint, en in die tabellen zitten weer 10 kolommen elk, dan krijg je ontiegelijk veel extra data die je helemaal niet nodig hebt.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.