26. juni 2013 - 16:42
Der er
24 kommentarer og 1 løsning
Unknown column 'tp.kundeid' in 'on clause'
Jeg er skiftet fra en server med mysql 5.0.41 til en server med mysql 5.1.66. Nu får jeg fejl i mange af php-dokumenterne. Ovenstående fejl kommer når jeg kører følgende SQL: SELECT UNIX_TIMESTAMP(tp.oprettet) AS oprettet, UNIX_TIMESTAMP(tp.redigeret) AS redigeret, tp.id AS projektid, tp.projektnavn, IF(tk.firma != '',tk.firma,CONCAT(tk.fornavn,' ',tk.efternavn)) AS kunden, CONCAT(tk.firma,' ',tk.fornavn,' ',tk.efternavn,'\n',tk.adresse,if(tk.adresse2 != '', CONCAT('\n',tk.adresse2,'\n'),'\n'),tk.zipcode,' ',tk.city) AS kundenavn, CONCAT(tpa.adresse,(if(tpa.adresse2 != '', CONCAT('\n',tpa.adresse2,'\n'),'\n')),tpa.zipcode,' ',tpa.city,'\n',tpa.telefon) AS projektadresse, IF(tpa.adresse != '',CONCAT(tpa.adresse,' ',tpa.adresse2),CONCAT(tk.adresse,' ',tk.adresse2)) AS projektadressevej FROM tblprojektrel tpr, tblprojekt tp, tblorders tol LEFT JOIN tblkunder AS tk ON tk.id = tp.kundeid LEFT JOIN tblprojektadresser AS tpa ON tpa.projektid = tp.id WHERE tp.id = tpr.projektid AND tpr.type = 1 AND tpr.relid = tol.id AND ISNULL(tp.lukket) AND tol.lukket LIKE '0000-00-00 00:00:00' GROUP BY tpr.projektid ORDER BY tpr.projektid DESC Kan nogen hjælpe?
Annonceindlæg fra SoftwareOne
Så indeholder tabellen tblprojekt vel ikke et felt, der hedder kundeid?
Men SELECT-sætningen er lidt suspekt, for når du siger GROUP BY tpr.projektid så kan du principielt ikke bruge tp.oprettet og tp.redigeret og flere andre, som måske ikke giver mening. MySql tillader det desværre, så vi kan skyde os selv i foden.
Jo det gør den faktisk. :-) Jeg har tjekket. Og fjerner jeg den LEFT JOIN, så er det bare den næste LEFT JOIN i rækken problemet opstår ved (tp.id) Men nu tjekker jeg lige igen. Vær sød at hænge på.
Jeg har lige tjekket igen. Column finder godt nok. Det er et site jeg skal flytte over for en jeg kender. Der er helt sikkert masser af kode som kan optimeres. Mener du at SELECT sætningen supekthed kan gøre at sådan en fejl vises?
Nej, det er bare noget rod, at det er tilladt at gøre det på den "suspekte" måde. Og det kan give forkerte resultater (men jeg har ikke sat mig ind i dine tabeller og forespørgsel). Når der står "tblprojekt tp" og "tblkunder AS tk ON tk.id = tp.kundeid" så er det vel fordi tblprojekt ikke indholder et felt med det navn - uanset hvad du ellers påstår ;)
hehe, jamen jeg ved godt det ser mærkeligt ud. Vi har fået Solutio (solutio.dk) til at flytte databaserne for os, fra vores egen hostet server (som skal lukkes) og over på deres webhotel. Når jeg går ind i phpmyadmin, så er felterne der godt nok :)
Kan du så sige SELECT kundeid FROM tblkunder i phpmyadmin?
CREATE TABLE IF NOT EXISTS `tblprojekt` ( `id` int(11) NOT NULL AUTO_INCREMENT, `editorid` int(11) NOT NULL DEFAULT '0', `redigeret` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `oprettet` datetime DEFAULT NULL, `opretter` int(11) NOT NULL DEFAULT '0', `projektnavn` tinytext NOT NULL, `kundeid` int(11) NOT NULL DEFAULT '0', `lukket` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), KEY `kundeid` (`kundeid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2509 ;
Viser poster 0 - 29 ( 2,415 total, forepørgsel tog 0.0002 sek) SELECT kundeid FROM `tblprojekt` LIMIT 0 , 30
26. juni 2013 - 18:11
#10
Ups SELECT kundeid FROM tblprojekt
26. juni 2013 - 18:15
#11
Har PHP forbindelse til den rigtige database? Og er alle tabellerne virkelig MyISAM - det er lidt usædvanligt i et rigtigt projekt... Jeg mener, så er der jo stort ingen consistency-check? (jeg er på igen senere i aften)
26. juni 2013 - 18:19
#12
Ja det er forbindelse til den rigtige database. Jeg har prøvet andre funktioner, såsom ændre brugerindstillinger og der er ændringen straks at se i phpmyadmin. Alle tabeller er MyISAM. Ved ikke hvorfor. Jeg er helt blank. Aner ikke hvorfor den fejl kommer.
26. juni 2013 - 18:21
#13
Hvis jeg kører SQL'en i phpmyadmin så kommer samme fejl (naturligvis/heldigvis)
26. juni 2013 - 18:48
#14
Jeg har forsøgt at barbere lidt ned i SQL'en. Følgende giver samme fejl: ------------------------------------ SELECT * FROM tblprojekt, tblorders LEFT JOIN tblkunder ON tblkunder.id = tblprojekt.kundeid ------------------------------------ Følgende giver ikke fejl: ------------------------------------ SELECT * FROM tblprojekt LEFT JOIN tblkunder ON tblkunder.id = tblprojekt.kundeid
26. juni 2013 - 19:49
#15
Kan det have noget at sige at der i phpmyadmin står: De ekstra features for at arbejde med linkede tabeller er deaktiveret. For at se hvorfor, klik her. Og ved klik her: -------------------------------- $cfg['Servers'][$i]['pmadb'] ... ikke OK [ Dokumentation ] $cfg['Servers'][$i]['relation'] ... ikke OK [ Dokumentation ] Generelle relationsmuligheder: Slået fra -------------------------------- Men om det kun gælder for phpmyadmin ved jeg ikke?
26. juni 2013 - 20:20
#16
Ja, der er nogle udgaver, hvor man ikke må blande "komma"-join med "JOIN"-join. Prøv at lave den øverste som SELECT * FROM tblprojekt JOIN tblorders ON tblprojekt.xxxxxx=tblorders.yyyyyy LEFT JOIN tblkunder ON tblkunder.id = tblprojekt.kundeid
26. juni 2013 - 20:26
#17
Komma-joins skal det forståes som: FROM tabel1, tabel2, tabel 3 ? Jeg forstår desværre ikke hvad jeg skal gøre med alle de x'er og y'er i dit eksempel?
26. juni 2013 - 20:49
#18
Det er de feltnavne, der skal joines på. Det er sikkert nogen af dem der hedder noget med "id" - jeg kender ikke lige din tabelstruktur. Og, ja, det er "komma"-join du skriver i #17, som så efterfølges af noget sammenligning under WHERE.
26. juni 2013 - 21:02
#19
Okay, så det du kalder sammenligninger skal laves om til almindelige JOINS Så den oprindelige SQL kommer til at se således ud: ----------------------------------------------- SELECT UNIX_TIMESTAMP(tp.oprettet) AS oprettet, UNIX_TIMESTAMP(tp.redigeret) AS redigeret, tp.id AS projektid, tp.projektnavn, IF(tk.firma != '',tk.firma,CONCAT(tk.fornavn,' ',tk.efternavn)) AS kunden, CONCAT(tk.firma,' ',tk.fornavn,' ',tk.efternavn,'\n',tk.adresse,if(tk.adresse2 != '', CONCAT('\n',tk.adresse2,'\n'),'\n'),tk.zipcode,' ',tk.city) AS kundenavn, CONCAT(tpa.adresse,(if(tpa.adresse2 != '', CONCAT('\n',tpa.adresse2,'\n'),'\n')),tpa.zipcode,' ',tpa.city,'\n',tpa.telefon) AS projektadresse, IF(tpa.adresse != '',CONCAT(tpa.adresse,' ',tpa.adresse2),CONCAT(tk.adresse,' ',tk.adresse2)) AS projektadressevej FROM tblprojektrel tpr JOIN tblprojekt tp ON tp.id = tpr.projektid AND ISNULL(tp.lukket) JOIN tblorders tol ON tpr.relid = tol.id AND tol.lukket LIKE '0000-00-00 00:00:00' LEFT JOIN tblkunder AS tk ON tk.id = tp.kundeid AND tk.id = tp.kundeid LEFT JOIN tblprojektadresser AS tpa ON tpa.projektid = tp.id WHERE tpr.type = 1 GROUP BY tpr.projektid ORDER BY tpr.projektid DESC
26. juni 2013 - 21:06
#20
Ja, vistnok (jeg har kun lige skimmet) Men jeg vil flytte AND tol.lukket LIKE '0000-00-00 00:00:00' ned til WHERE-delen, da den som sådan ikke er med i JOINen. Så ... virker det nu?
26. juni 2013 - 21:07
#21
Det var løsningen. Hvem er den klaptorsk der er skyld i at jeg skal til at tilrette omkring 40 filer... ? :-) Jeg er sikker på at du Erik ved hvorfor denne version ikke tillader at blande komma-joins med sammenligninger?
26. juni 2013 - 21:13
#22
Tak for tilliden....og der var engang hvor jeg kunne skelne skidt fra kanel. Men i dag har jeg kun tommelfinger-reglen: Aldrig brug komma-joins.
26. juni 2013 - 21:34
#23
Jeg var slet ikke klar over at det var en tommerfingerregel :) men man lærer hver dag. Jeg er også begyndt at bruge mysqli og prepared statements Så hvis jeg ligger denne tommelfingerregel oveni, så må jeg være nogenlunde opdateret :) Var der noget i det jeg postede fra phpmyadmin som ledte dig på sporet?
26. juni 2013 - 22:21
#24
Dit #14 viste det tydeligt ;)
27. juni 2013 - 06:51
#25
Erik, tusind tak endnu en gang :)
Computerworld tilbyder specialiserede kurser i database-management