mysql count bizarre :(

alexbob
Invité n'ayant pas de compte PHPfrance

06 juin 2010, 01:16

Bonjour.
J'ai une commande toute bête :
SELECT rayons_filtres.id_rayon
FROM `rayons_filtres`
WHERE (
`rayons_filtres`.`id_filtre` = '6'
XOR `rayons_filtres`.`id_filtre` = '7'
XOR `rayons_filtres`.`id_filtre` = '7'
)
GROUP BY id_filtre
ORDER BY `rayons_filtres`.`id_filtre` ASC
LIMIT 0 , 30 
J'obtiens 1 seul résultat, le calcul est bon.

Je fait la même chose mais avec un count :
 SELECT COUNT( rayons_filtres.id_rayon ) AS nbr
FROM `rayons_filtres`
WHERE (
`rayons_filtres`.`id_filtre` = '6'
XOR `rayons_filtres`.`id_filtre` = '7'
XOR `rayons_filtres`.`id_filtre` = '7'
)
GROUP BY id_filtre
ORDER BY `rayons_filtres`.`id_filtre` ASC
LIMIT 0 , 30
J'obtien nbr = 2 ????
Pourquoi ?

Merci a vous.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 juin 2010, 09:27

Je dirai que c'est bizarre aussi...

Juste par curiosité, tu es sûr de ta condition WHERE? Parce que je comprends pas bien pourquoi tu utilises des XOR...
Quand tout le reste a échoué, lisez le mode d'emploi...

alexbob
Invité n'ayant pas de compte PHPfrance

06 juin 2010, 10:49

JE place la Table pour que ce soit plus facile à comprendre :
 
CREATE TABLE IF NOT EXISTS `rayons_filtres` (
  `id_rayons_filtres` int(11) NOT NULL auto_increment,
  `id_rayon` int(11) NOT NULL,
  `id_filtre` int(11) NOT NULL,
  `type` varchar(255) NOT NULL,
  `id_boutique` int(11) NOT NULL,
  `id_compte` int(11) NOT NULL,
  PRIMARY KEY  (`id_rayons_filtres`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

INSERT INTO `rayons_filtres` (`id_rayons_filtres`, `id_rayon`, `id_filtre`, `type`, `id_boutique`, `id_compte`) VALUES
(6, 53129, 6, 'marque', 67, 1),
(7, 53129, 7, 'modele', 67, 1),
(11, 53130, 6, 'marque', 67, 1),
(12, 53130, 7, 'modele', 67, 1),
(14, 53130, 10, 'age', 67, 1);

Je t'explique :
Si je veux sélectionner TOUT les "id_rayon" en fonction des valeurs d'une seule et même colonne ( ):
Mettons toujours dans cet exemple que veuillez tout les id_rayons unique quand id_filtre = 6
SELECT *
FROM rayons_filtres
WHERE id_filtre =6
GROUP BY id_rayon
LIMIT 0 , 30
Résultat ok, j'ai bien ce que je veux.
Maintenant j'ai besoin de sélectionner tout les résultats quand id_filtre = 6 et aussi 7
( avec un AND ca ne marchera pas ! Donc je fais un XOR... logique)
SELECT *
FROM rayons_filtres
WHERE id_filtre =6
XOR id_filtre =7
GROUP BY id_rayon
LIMIT 0 , 30

Le resultat est correcte, mais si j'ajoute maintenant une autre spécification :
SELECT *
FROM rayons_filtres
WHERE id_filtre =6
XOR id_filtre =7
XOR id_filtre = 10
GROUP BY id_rayon
LIMIT 0 , 30
Logiquement, si tu observe le contenu de la table, seul l'id rayon ( 53130)
possède un id_filtre = 6, un id_filtre = 7, et un id_filtre = 10.
Logiquement mysql ne renvois que lui. Pourtant ca n'est pas le cas ... Pourquoi ?
Même requête avec la commande IN ( 6, 7, 10 ) = Même résultat faux.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 juin 2010, 12:11

Maintenant j'ai besoin de sélectionner tout les résultats quand id_filtre = 6 et aussi 7
( avec un AND ca ne marchera pas ! Donc je fais un XOR... logique)
En clair, tu ne veux pas sélectionner les enregistrements où

Code : Tout sélectionner

id_filtre=6 ET id_filtre=7
ce qui n'est évidemment pas possible puisque l'id_filtre d'un enregistrement ne peut avoir qu'une seule valeur à la fois.

Ce que tu veux, c'est sélectionner les enregistrements donc la valeur de l'id_filtre est soit 6, soit 7 :

Code : Tout sélectionner

id_filtre=6 OU id_filtre=7
Donc un simple OR devrait suffire si j'ai bien compris.
Quand tout le reste a échoué, lisez le mode d'emploi...

alexbob
Invité n'ayant pas de compte PHPfrance

06 juin 2010, 12:33

Non je veux selectionner tout les id_rayon quand

id_fitlre = 6,
id_fitlre = 7,
id_fitlre = 10,

Avec OR, ca ne marche pas.
il renvois plusieur id_rayon alors que seul 53130 est présent dans


id_fitlre = 6,
id_fitlre = 7,
id_fitlre = 10,