[MySQL]Condition sur un COUNT ?

Condition sur un COUNT ? [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 26-04-2005 à 17:51:50    

Bonjour !  
 
J'ai un p'tit problème avec une requete SQL :  
Voici comment elle doit fonctionner :  
 
j'ai des salles de concerts qui peuvent avoir plusieurs concerts, et j'aimerais avoir la liste des salles de concerts ainsi que le nombre de prochains concerts qui auront lieux dans chaque salle. ( date_concert >= NOW() ). Si la salle n'a aucun prochain concert, bah, le count doit donner 0
 
Cardinalité : une salle peut avoir plusieurs concerts.
 
Pour relier ces deux tables, j'utilise l'identifiant id_lieu  
 
Le problème, c'est que...bah, j'y arrive pas :cry:  
 
Voici ma requete actuelle :  

Code :
  1. SELECT l. * , COUNT( DISTINCT ( c.date_concert >= NOW( ) ) ) AS nb_concert
  2. FROM lieu l
  3. LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu
  4. GROUP BY l.id_lieu


Elle me donne normalement bien ce que je veux mais le problème est que si la salle n'a aucun concert de prévu, la requete m'indique un count a 1  :( (alors que je veux 0 ! )
 
Je pense qu'il est possible de modifié la condition sur le count, mais je ne sais pas trop comment.
 
 
Merci de m'avoir lu !


Message édité par zapan666 le 26-04-2005 à 17:53:38
Reply

Marsh Posté le 26-04-2005 à 17:51:50   

Reply

Marsh Posté le 27-04-2005 à 08:33:35    

zapan666 a écrit :


Voici ma requete actuelle :  

Code :
  1. SELECT l. * , COUNT( DISTINCT ( c.date_concert >= NOW( ) ) ) AS nb_concert
  2. FROM lieu l
  3. LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu
  4. GROUP BY l.id_lieu


Elle me donne normalement bien ce que je veux mais le problème est que si la salle n'a aucun concert de prévu, la requete m'indique un count a 1  :( (alors que je veux 0 ! )
 
Je pense qu'il est possible de modifié la condition sur le count, mais je ne sais pas trop comment.


Salut,
 
Je ne connais pas particulièrement MySQL mais il me semble que tu ferais mieux de faire un WHERE sur ton JOIN (peut-être pas possible avec MySQL?). Comme ça, ton COUNT ne se fait déjà directement que sur ce qui t'intéresse:
 
SELECT COUNT(c.date_concert) AS nb_concert FROM lieu l LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu WHERE c.date_concert >= NOW() GROUP BY l.id_lieu
 
Il me semble que ça devrait fonctionner.
 
A+

Reply

Marsh Posté le 27-04-2005 à 11:28:18    

SELECT l.id_lieu, COUNT(l.id_lieu) AS nb_concert
FROM lieu l
LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu
WHERE c.date_concert >= NOW( )
GROUP BY l.id_lieu
 
si tu veux rajouter une autre information dans ton select, elle doit apparaitre dans le group by.
Tu ne pourras pas faire un regroupement sur *


---------------
MZP est de retour
Reply

Marsh Posté le 27-04-2005 à 13:10:18    

cinocks a écrit :

SELECT l.id_lieu, COUNT(l.id_lieu) AS nb_concert
FROM lieu l
LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu
WHERE c.date_concert >= NOW( )
GROUP BY l.id_lieu


Je ne peux pas utilisé la clause WHERE dans ce cas là ! En effet, avec cette clause je vais supprimer les salles qui n'ont pas prévu de concert, alors que je les veux quand même ces salles !
 
J'y ais réfléchi & voilà ce que j'aurais voulu faire : faire votre requete (donc avec le where) pour avoir les salles avec les prochaines concerts et refaire une jointure, une nouvelle fois sur la tableau des salles de concerts (lieu) pour récupérer les salles sans concert : le problème est que mysql fait la jointure PUIS fais le WHERE (alors que moi, si il pouvait faire le WHERE puis la jointure que je veux, ça m'arrangerais)
 
 

Reply

Marsh Posté le 27-04-2005 à 13:53:34    

Hey Zapan mon ami ! (oui, j'ai l'immense honneur de connaitre Zapan et alors ? Je connais beaucoup d'autres gens que vous ne connaissez pas !!!)
 
Je dis ca comme ca (ca fait un an que j'ai arreté la BDD complexe), mais avec un Having des fois y aurai pas une solution avec une requete imbriquée ?????

Reply

Marsh Posté le 27-04-2005 à 14:43:13    

Mysql 3.quelquechose => pas de requete imbriqué possible :(

Reply

Marsh Posté le 27-04-2005 à 17:55:33    

Tu as essayé la requête de cinocks ?
 
Ca a l'air ok à 1ère vue ...
 

Code :
  1. SELECT l.id_lieu,
  2.        COUNT(c.id_lieu) AS nb_concert
  3. FROM lieu l
  4. LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu
  5. WHERE c.date_concert >= NOW()
  6. GROUP BY l.id_lieu;

Reply

Marsh Posté le 27-04-2005 à 18:12:53    

ouais, j'ai essayé : le problème, c'est que ça élimine les salles qui n'ont pas prévu de concert (hors, je veux la liste de toutes les salles !)
 
Résultat de la requete de cinocks :  

Code :
  1. id_lieu      nb_concert
  2. 2  1
  3. 3  2
  4. 7  1


(sachant que j'ai 8 salles, avec des ids qui vont de 1 à 8

Reply

Marsh Posté le 27-04-2005 à 20:58:15    

et si tu fais :
 
SELECT DISTINCT l.id_lieu, 0
FROM lieu l
LEFT OUTER JOIN concert c ON c.id_lieu = l.id_lieu  
WHERE c.date_concert >= NOW()  
AND c.id_lieu IS NULL;
 
Ca te renvoie les salles n'ayant pas prévu de concert ???
 
Si c'est le cas tu peux faire l'union de ces deux requêtes ...

Reply

Marsh Posté le 27-04-2005 à 21:48:02    

bah, le pb de l'union, c'est que sur le serveur SQL que j'ai, bah, je crois qu'elle y est pas ( 3.23.52 ) mais comme je crois que sur les comptes Free, la version de mysql est une 4.quelquechose, et qu'apparament, ces versions acceptes l'union...bah, j'vais pi être passer a la 4.quelque chose chez moi pour utiliser l'union ;)
 
 
(mais si quelqu'un trouve comment faire sans l'union, je prend quand même ;))

Reply

Marsh Posté le 27-04-2005 à 21:48:02   

Reply

Marsh Posté le 27-04-2005 à 21:49:56    

En même temps, tu peux aussi faire 2 requêtes séparées ... :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed