Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Du bruger heller ikke tpr i nogen af dine left joins. Det der med ikke at blande "komma-joins" og joins angivet med nøgleordet JOIN er bare den nemme regel.
Men det virker vel hvis du skriver JOIN alle steder, ikke?
"Please notice that from version 5.0.12 on there is a change in the syntax of JOIN ... ON (currently being documented) that makes the syntax SQL:2003 compliant. The essense of the change is that the ON condition of a JOIN ... ON clause may reference only tables that are in one of the operands of the JOIN. "
Jeg fik nedgraderet til tidligere version igen, da for mange sites var berørt og ikke fungerede.
Men for lige at forstå det korrekt... Eller rettere: På siden du linker til er der et eksempel:
Den illegale: select * from t1 join (t2 join t3 on t1.a = t3.c); is incorrect because the operands of the second join are 't2' and 't3', but not 't1', thus referring to 't1.a' is an error.
Den legale: select * from (t1 join t2) join t3 on t1.a = t3.c; Here the first operand of the second join is a virtual table t1t2 = (t1 join t2), such that 't1t2' contains the column t1.a.
Jeg forstår ikke hvordan 3 tabeller kan joines uden at der er defineret en relation. Eksempelvis hvordan er t2 joined med t1 når ingen relation er defineret
Og hvorfor lavede de egentlig den ændring fra 4.1.22 til 5.0.41 ? hvad er årsagen, fungerede det ikke fint nok? mit gjorde da :)
Jeg har prøvet at omskrive sql'en som du foreslog:
Gammel 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
------------------------
Omskrevet 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 tblorders AS tol
JOIN tblprojekt AS tp ON tp.id = tpr.projektid AND ISNULL(tp.lukket)
JOIN tblprojektrel AS tpr ON tpr.relid = tol.id AND tpr.type = 1
JOIN tblkunder AS tk ON tk.id = tp.kundeid
LEFT JOIN tblprojektadresser AS tpa ON tpa.projektid = tp.id
WHERE tol.lukket LIKE '0000-00-00 00:00:00'
GROUP BY tpr.projektid
ORDER BY tpr.projektid DESC -------------------------
De begge giver 59 poster, så resultatet ser ud til at være det samme. Kan du se om omskrivningen ser ud til at skulle give samme resultat eller er der noget som vil kunne lave afvigelser?
Jeg har taget tid på hvor lang tid det tager at afvikle phpsiden, dvs kaldet til db og udskrift (mysql_fetch_array) til browseren. Det tager i begge tilfælde altid 0.08 - 0.14
Jeg ville flytte AND ISNULL(tp.lukket) AND tpr.type = 1 ud til din where, da de ikke er join-betingelser. Det bør ikke give nogen forskel på nogen måde, men er for læselighedens skyld.
Ellers ser det helt korrekt ud. Og det er både betryggende og forventet, at det kører lige hurtigt på den ene og på den anden måde.
Jo, det er ofte sådan man skruer en join sammen. Det behøver dog ikke være formelt defineret som en fremmesnøgle i SQL-en. Joins kan være dyre, derfor få mysql til at fortælle dig hvordan den vil lave den (Explain kommandoen), og se om du har de rigtige indexer på. ... i hvert fald hvis det tager for lang tid.
En left join behøver ikke matche noget i den "højre" tabel, men du får i så fald felter med NULL.
Det er princippet ja, men man skal vide hvordan man læser sådan et Explain output. Og man skal helst gøre det på tabeller af forventet størrelse og indhold.
Synes godt om
Ny brugerNybegynder
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.