par Vurtu » 18 juil. 2008, 10:59
hm, si je peux me permettre... NON on ne fait pas de jointure sur une clause WHERE! scrogneugneu une jointure c'est Code : Tout sélectionnerSELECT ... FROM table1 AS t1 LEFT JOIN table2 AS t2 ON (t1.champ1 = t2.champ2) WHERE ... Vous me copierez 100 fois "je ne ferai plus de jointure sur une clause WHERE" non mais oh
Code : Tout sélectionner
SELECT ... FROM table1 AS t1 LEFT JOIN table2 AS t2 ON (t1.champ1 = t2.champ2) WHERE ...
par Sékiltoyai » 17 juil. 2008, 18:00
while(list($machin,$truc) = each($tab))
foreach($tab as $machin=>$truc)
par caroube » 17 juil. 2008, 17:43
Le truc c'est que conceptuellement une jointure se fait par JOIN.
Using Join Queries: Example Code : Tout sélectionnerSELECT last_name, job_id, departments.department_id, department_name FROM employees, departments WHERE employees.department_id = departments.department_id; Using Self Joins: Example Code : Tout sélectionnerSELECT e1.last_name||' works for '||e2.last_name "Employees and Their Managers" FROM employees e1, employees e2 WHERE e1.manager_id = e2.employee_id AND e1.last_name LIKE 'R%'; Using Outer Joins: Example Code : Tout sélectionnerSELECT d.department_id, e.last_name FROM departments d LEFT OUTER JOIN employees e ON d.department_id = e.department_id ORDER BY d.department_id; Using Antijoins: Example Code : Tout sélectionnerSELECT * FROM employees WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 1700); Using Semijoins: Example Code : Tout sélectionnerSELECT * FROM departments WHERE EXISTS (SELECT * FROM employees WHERE departments.department_id = employees.department_id AND employees.salary > 2500);
SELECT last_name, job_id, departments.department_id, department_name FROM employees, departments WHERE employees.department_id = departments.department_id;
SELECT e1.last_name||' works for '||e2.last_name "Employees and Their Managers" FROM employees e1, employees e2 WHERE e1.manager_id = e2.employee_id AND e1.last_name LIKE 'R%';
SELECT d.department_id, e.last_name FROM departments d LEFT OUTER JOIN employees e ON d.department_id = e.department_id ORDER BY d.department_id;
SELECT * FROM employees WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 1700);
SELECT * FROM departments WHERE EXISTS (SELECT * FROM employees WHERE departments.department_id = employees.department_id AND employees.salary > 2500);
par ouckileou » 17 juil. 2008, 14:08
par Sékiltoyai » 17 juil. 2008, 13:11
par caroube » 17 juil. 2008, 10:51
La clause WHERE pour faire des jointures n'est plus recommandée pour les SGBD actuels car moins performante que JOIN.
Toutes les conditions du LEFT JOIN sont transmises à la clause WHERE.
Depuis la version 4.0.14, MySQL effectue l'optimisation LEFT JOIN suivante : si la condition WHERE est toujours fausse pour la ligne NULL générée, la jointure LEFT JOIN est transformée en jointure normale. Par exemple, dans la requête suivante, la clause WHERE sera fausse si t2.column est NULL : il est donc valide de convertir la jointure en une jointure normale. Code : Tout sélectionnerSELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5; Par conséquent, il est possible de convertir la requête en jointure normale : Code : Tout sélectionnerSELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column1=t2.column1; Cela peut se faire plus rapidement, car MySQL peut maintenant utiliser la table t2 avant la table t1 si les relations sont plus favorables.
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
par ouckileou » 17 juil. 2008, 09:19
par Sékiltoyai » 17 juil. 2008, 01:23
par AB » 16 juil. 2008, 22:51
En fait il est préférable de faire les jointures par JOIN pour aider le SGBD à optimiser la requète…
par zeus » 16 juil. 2008, 20:22
par Sékiltoyai » 16 juil. 2008, 19:47
par caroube » 16 juil. 2008, 19:30
par Shrell » 16 juil. 2008, 11:26
par Vurtu » 15 juil. 2008, 15:10
SELECT [...] FROM automobile as a, options as o WHERE a.id=o.auto_id
par nebil » 15 juil. 2008, 15:03