Aide requête MySQL avec count

  • Auteur de la discussion Auteur de la discussion sim100
  • Date de début Date de début
WRInaute passionné
Bonjour à tous,

J'ai besoin d'une petite requête MySQL que je n'arrive pas à faire.
Il s'agit de compte combien de fois éBlue Diamond" apparait dans 3 champs

Donc ma table est du style (avec 3 lignes)
... restaurant1 | restaurant2 | restaurant3....
Blue Diamond | Kanjana | Le Spice
Vihara Liangsan | Kitchen Hush | Vietnamese Sripoom
Blue Diamond | Pasta Cafe | Blue Diamond

Alors vous voyez que dans les 3 champs (restaurant1, restaurant2, restaurant3), le terme "Blue Diamond" apparait 3 fois

Alors si je ne compte le nombre de fois où Blue Diamond apparait dans le champs restaurant1, ça marche avec la requête
Code:
$catname=mysql_fetch_row(@mysql_query("SELECT COUNT(*) FROM cmg_members WHERE restaurant1='Blue Diamond'",$db));

Donc ça me sort 2, c'est bon, Blue Diamond apparait 2 fois dans le champs restaurant1

Mais pour les 3 champs je fait la requête:
Code:
$catname=mysql_fetch_row(@mysql_query("SELECT COUNT(*) FROM cmg_members WHERE restaurant1='Blue Diamond' and restaurant2='Blue Diamond' and restaurant3='Blue Diamond'",$db));

Et ça me sort 0
Ca devrait me sortir 3

Avez vous une idée de pourquoi ma requête n'est pas bonne ?

Merci beaucoup pour l'aire
:)
 
WRInaute impliqué
Moi, j'aurais mis "ou" et non "and".

Parce que là tu cherche à compte les ligne sur laquelle rest1, rest2 et res3 ont "blue diamond" sur la même ligne... Et t'en a 0.


Et pour la petite histoire, tu devrais coder ainsi :

Code:
$sql = "SELECT ...'"

Connexion à la bdd

$res = mysql_query($sql)

Déconnexion de la bdd

$catname=mysql_fetch_row
C'est plus simple à lire.
Tu fait toutes tes requêtes avant d'ouvrir la connexion à la bdd, la connexion reste ainsi très courte et tu fini par le traitement des données.
Et les @, tu les met juste avant de mettre en prod. Ca t'aidera pour trouver plus facilement des erreurs durant le dev.
 
WRInaute passionné
Merci Dolph
En effet, ça compte les lignes, du coup si je met des "OR" le résultat est 2, car il y a 2 lignes contenant Blue Diamond.

Moi il faut que je compte le nombre de fois où Blue Diamond apparait

Si quelqu'un a une idée de la requête à faire...

Merci
 
WRInaute impliqué
Ça sent encore une base de données mal fichue cette histoire ;)

En théorie, tu devrais avoir une table "Restaurant" avec une association entre celle-ci et celle où tu as tes trois champs.
À partir de là, une jointure et un "count" auraient suffis.

Parce, dans ton fonctionnement, les requêtes sont un poil complexe.
Essaie quelque de ce genre :
Code:
SELECT SUM(restaurant1='Blue Diamond' + restaurant2='Blue Diamond' + restaurant3='Blue Diamond') FROM cmg_members

C'est stylé comme requête :D
 
WRInaute accro
Faudrait ouvrir un forum : Merise et le modèle entité -association :mrgreen: La base de tout ! Même si quelquefois je concède qu'il faut savoir prendre des liberté avec une application stricte du modèle ...

Bon dans ton cas, puisque le schéma de données n'est pas idéal, le plus simple il me semble pour obtenir ton 3 :

1 - tu choppes toutes les lignes qui contiennent la chaine (au passage un champs unique concatenant tout ramenera ta recherche a un seul champs - justement on parlait de liberté vis a vis du modèle qui édicte zero redondance :wink: )
2 - tu rappatries dans un array et tu boucle en php (enfin si la selection fait pas 125.000 fiches ...)
 
WRInaute passionné
Merci Blount

Non non, ma base est très bien configurées et mes tables aussi ;)

J'ai juste donné un exemple pour un truc que je voulais.

Merci, j'ai trouvé la réponse et tout roule :)

Merci à tous
 
Discussions similaires
Haut