Avatar billede htx98i17 Professor
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?
Avatar billede erikjacobsen Ekspert
26. juni 2013 - 17:55 #1
Så indeholder tabellen tblprojekt vel ikke et felt, der hedder kundeid?
Avatar billede erikjacobsen Ekspert
26. juni 2013 - 17:57 #2
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.
Avatar billede htx98i17 Professor
26. juni 2013 - 17:58 #3
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å.
Avatar billede htx98i17 Professor
26. juni 2013 - 18:01 #4
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?
Avatar billede erikjacobsen Ekspert
26. juni 2013 - 18:05 #5
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 ;)
Avatar billede htx98i17 Professor
26. juni 2013 - 18:08 #6
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 :)
Avatar billede erikjacobsen Ekspert
26. juni 2013 - 18:10 #7
Kan du så sige

  SELECT kundeid FROM tblkunder

i phpmyadmin?
Avatar billede htx98i17 Professor
26. juni 2013 - 18:10 #8
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 ;
Avatar billede htx98i17 Professor
26. juni 2013 - 18:11 #9
Viser poster 0 - 29 ( 2,415 total, forepørgsel tog 0.0002 sek)
SELECT kundeid
FROM `tblprojekt`
LIMIT 0 , 30
Avatar billede erikjacobsen Ekspert
26. juni 2013 - 18:11 #10
Ups

SELECT kundeid FROM tblprojekt
Avatar billede erikjacobsen Ekspert
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)
Avatar billede htx98i17 Professor
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.
Avatar billede htx98i17 Professor
26. juni 2013 - 18:21 #13
Hvis jeg kører SQL'en i phpmyadmin så kommer samme fejl (naturligvis/heldigvis)
Avatar billede htx98i17 Professor
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
Avatar billede htx98i17 Professor
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?
Avatar billede erikjacobsen Ekspert
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
Avatar billede htx98i17 Professor
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?
Avatar billede erikjacobsen Ekspert
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.
Avatar billede htx98i17 Professor
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
Avatar billede erikjacobsen Ekspert
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?
Avatar billede htx98i17 Professor
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?
Avatar billede erikjacobsen Ekspert
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.
Avatar billede htx98i17 Professor
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?
Avatar billede erikjacobsen Ekspert
26. juni 2013 - 22:21 #24
Dit #14 viste det tydeligt ;)
Avatar billede htx98i17 Professor
27. juni 2013 - 06:51 #25
Erik, tusind tak endnu en gang :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester