Description:
Same queries on same tables returns randomly different results depending on the preceding query.
How to repeat:
Download tables here :
ftp://support.mysql.com/pub/mysql/secret/leftjoin.tar.gz
Then, try the following :
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (ref_mag) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie);
Empty set (0.47 sec)
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat,ref_mag FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (ref_mag) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie);
Empty set (0.46 sec)
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (nom) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie)
UNION
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(marques.nom_marque LIKE 'scanneur%') GROUP BY produits.categorie)
UNION
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(categories.nom_cat LIKE 'scanneur%') GROUP BY produits.categorie)
UNION
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (ref_mag) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie)
UNION
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (stocks.marque) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie) ORDER BY a DESC;
+-----+-----------+--------------------------------+
| a | categorie | nom_cat |
+-----+-----------+--------------------------------+
| 806 | 5 | Moniteurs |
| 539 | 1 | Cartes graphiques |
| 517 | 2 | Cartes mères |
| 383 | 29 | Supports de stockage |
<cut>
| 34 | 40 | Barebones |
| 33 | 16 | Lecteurs CD |
| 32 | 43 | Racks |
| 13 | 31 | Volants |
+-----+-----------+--------------------------------+
45 rows in set (2.03 sec)
Now the same query than the first one :
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (ref_mag) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie);
+-----+-----------+--------------------------------+
| a | categorie | nom_cat |
+-----+-----------+--------------------------------+
| 539 | 1 | Cartes graphiques |
| 517 | 2 | Cartes mères |
| 346 | 3 | Disques durs |
| 375 | 4 | Mémoires |
<cut>
| 282 | 42 | Tuning |
| 32 | 43 | Racks |
| 85 | 44 | Watercooling |
| 44 | 45 | Imprimantes multifonctions |
+-----+-----------+--------------------------------+
45 rows in set (0.64 sec)
Same query, with the ref_mag column added :
(SELECT COUNT(DISTINCT(produits.id_produit)) as a,produits.categorie,categories.nom_cat,ref_mag FROM categories LEFT JOIN
produits ON produits.categorie=categories.id_cat LEFT JOIN stocks ON (produits.id_produit=stocks.id_produit AND stocks.maj=1)
LEFT JOIN magasins ON stocks.magasin=magasins.id_mag,marques WHERE marques.id_marque=produits.marque AND
(MATCH (ref_mag) AGAINST ('+scanneur*' IN BOOLEAN MODE)) GROUP BY produits.categorie);
Empty set (0.47 sec)
Note after testing several times my testcase, it appears the result could change from time to time, but if you try several times those differents queries, you should finally see the problem.