Forum Clubic

Probleme de requete

Bonjour,

Voila je tente de faire une requête ou je pourrai avoir la liste des salles avec le nombre de matériel qu’elles contiennent. Pour cela j’aurai besoin de combiner c’est deux requete mais je ne trouve pas comment le faire ou alors je m’y prend comme un pied lol

SELECT [Saisissez une salle] AS [“Votre choix”], Count(MATERIEL.id_materiel) AS [“Nombre d’objet de cette salle”]
FROM CATEGORIE, MATERIEL, SE_SITUER, SALLE
WHERE (((SALLE.id_salle)=([Saisissez une salle]) And (SALLE.id_salle)=(SE_SITUER.id_salle)) And ((CATEGORIE.id_categorie)=(MATERIEL.id_categorie)) And ((SE_SITUER.id_materiel)=(MATERIEL.id_materiel)));

elle montre le nombre de materiel pour une salle choisi par l’utilisateur

SELECT DISTINCT id_salle
FROM SALLE;

elle etabli la liste des salle

et moi je veut la liste des salle avec le nombre de materiel contenu sans avoir a faire de saisie
merci

Sans regarder quel est ton réel problème, je t’orienterais vers une fonction SQL : JOIN LEFT
Peut-être je ne servirai à rien, mais j’ai pas le temps ce soir de lire convenablement, je m’en excuse, je te donne juste une piste pour une solution qui pourrait calquer à ton problème.

Bonne nuit!

ok je vai essayer

J’ai tester cela mais je n’ai pas ma seconde colonne :@

SELECT DISTINCT id_salle
FROM SALLE
WHERE EXISTS (SELECT Count(MATERIEL.id_materiel) AS [“Nombre d’objet de cette salle”]
FROM CATEGORIE, MATERIEL, SE_SITUER
WHERE (( ((CATEGORIE.id_categorie)=(MATERIEL.id_categorie)) And ((SE_SITUER.id_materiel)=(MATERIEL.id_materiel))))
)

Heu,

Je vois plutot un truc de ce genre la:

SELECT id_salle, count(*)
FROM SE_SITUER, SALLE
WHERE SE_SITUER.id_salle = SALLE.id_salle
GROUP BY id_salle

… ca c est si tu veux juste compter ton materiel dans une salle spécifique et en supposant que SE_SITUER est bien a jour. Apres si tu veux encore plus restreindre par exemple a une categorie de materiel faut ajouter les tables necessaire.

Mais bon le ‘group by’ est la facon de faire pour compter. Ptet que ta premiere requete elle marche avec un group by en eliminant (SALLE.id_salle)=([Saisissez une salle]) et en ajoutant GROUP BY SALLE.id_salle
(d ailleurs cela doit marcher lol… trop con le matin moi)

Cdlt,

et voila j’ai encore et toujour le meme message d’erreur : vous essayer d’executer une requete ne comprenant pas l’expression specifiée ‘id_salle’ comme partie de la fonction d’agregat

j’ai eu aussi une histoire comme quoi id_salle representai tro de table et qu’il ne savai pas laquelle choisir pourtant avec SE_SITUER.id_salle moi je n’en voit pas 36

mais merci chryso je vai creuser l’idée du group by

Bah le message d’erreur est clair, la colone id_salle n’existe pas dans la table que tu as appelée .

pardon,
changes le group by en:
GROUP BY SALLE.id_salle
et aussi au niveau du SELECT il faut utiliser SALLE.id_salle
Sinon il voudra pas faire le regroupement :slight_smile:
Edité le 22/03/2008 à 08:11

Jpropose un autre truc sinon bon sa revient au même(bien que niveau performance elle irait plus vite car elle ne relit rien entre les 2 tables bon sa on lvois sur les applications de performance sql mais à l’oeil nu sa svois que si t’as vraiment beaucoup de donnée ) mais c’est plus dans le style que j’aurais fait :

SELECT id_salle, count(*)
FROM SE_SITUER
WHERE id_salle in (SELECT id_salle FROM SALLE GROUP BY id_salle)

J’ai repris selon ce qu’a fait Chryso donc si ce qu’a fait Chryso sa marche alors sa aussi sa devrait marcher^^

re tout le monde cette fois c’est pour une autre requête que je galère

J’ai vérifié ma sous requête marche (j’ai les états qui s’affiche avec la dernière date ou cela a été vérifier) mais quand je fait marcher le tout eh bien je vous laisse deviner! J’ai toutes les dates grrrrrr j’ai tourner dans tout les sens ça marche pas :@ :frowning:

Je fait par requete imbriquer car avec la sous requete seule je n’arrive pas a avoir tout les champ que je veut (il me met qu’ils ne font pas parti de la fonction d’agregat) :frowning:
Edité le 02/04/2008 à 11:52

C’est dans ta clause where que sa va pas. Jpeux pas trop t’aider car je vois pas ce que tu cherches à faire dans cette condition. :frowning:

Sauf si tu donnes des détails sur cette condition :smiley:
Edité le 02/04/2008 à 15:15

en gros ce que je veut avoir c’est l’id_materiel avec le nom son etat sa marque a la derniere date de verification
avec la seconde requete j’ai pas toute les rubriques et avec toutes la requete j’ai toute les rubriques mais aussi toute les dates de verif d’un materiel alors que je ne veut que la plus recente :frowning: la seconde requete dans le where devai me servir a avoir juste les dates les plus recente de verif

Si j’ai bien compris tu peux essayer sa à la limite :

SELECT MATERIEL.id_materiel, MATERIEL.nom, MATERIEL.marque, ETRE.date, ETAT.etat
FROM ETAT INNER JOIN (MATERIEL INNER JOIN ETRE ON MATERIEL.id_materiel=ETRE.id_materiel) ON ETAT.id_etat=ETRE.id_etat
WHERE ETRE.date in (
SELECT max (date)
FROM etre)

merci tck ca marche mais je n’obtient de resultat que pour un produit alors qu’il devrai y en avoir 3 :slight_smile:

A si tu veux les 3 premiers tu peux faire comme sa à ce moment la :

SELECT MATERIEL.id_materiel, MATERIEL.nom, MATERIEL.marque, ETRE.date, ETAT.etat
FROM ETAT INNER JOIN (MATERIEL INNER JOIN ETRE ON MATERIEL.id_materiel=ETRE.id_materiel) ON ETAT.id_etat=ETRE.id_etat
WHERE ETRE.date in (
SELECT date
FROM etre
ORDER BY date DESC LIMIT 0,3
)

Bonne continuation :wink:
Edité le 02/04/2008 à 21:57

ca devrai marcher mais ca me marque que date ne fait pas pari de la fonction d’agrégat :@ je commence a avoir des envies de meurtre quand je vois ce message

A excuse, normal date est une fonction en sql donc lui il l’interprète comme tel et non comme le nom de la colone (enfin jpense que sa vient de la)

Essaye sa :

SELECT MATERIEL.id_materiel, MATERIEL.nom, MATERIEL.marque, ETRE.date, ETAT.etat
FROM ETAT 
INNER JOIN (MATERIEL INNER JOIN ETRE ON MATERIEL.id_materiel=ETRE.id_materiel) ON ETAT.id_etat=ETRE.id_etat
WHERE ETRE.date in (
SELECT ETRE.date
FROM ETRE
ORDER BY ETRE.date DESC LIMIT 0,3
)

Je sais pas si sa marchera j’suis jamais tomber sur un problème comme sa vu qu’il est déconseillé de nommer ses colonnes comme le nom de fonction existante, jles nome toujours différemment^^

Sinon une plus sous la forme que j’aurais faite personellement^^

SELECT Ma.id_materiel, Ma.nom, Ma.marque, Etr.date, Eta.etat
FROM ETAT Eta
INNER JOIN (MATERIEL Ma INNER JOIN ETRE Etr ON Ma.id_materiel=Etr.id_materiel) ON Eta.id_etat=Etr.id_etat
ORDER BY Etr.date DESC LIMIT 0,3

Edité le 03/04/2008 à 09:13

ben maintenant il me met que c’est ETRE.date qui n’en fait pas parti :slight_smile:

vive access :MDR
Edité le 03/04/2008 à 09:08

Ptit up au cas ou que tu n’aurais pas vu l’édition de mon post avec la 2ème requête que j’ai proposée^^

Sinon jsais pas si access gère le top mais tu peux avoir aussi cette forme la :

SELECT TOP 3 Ma.id_materiel, Ma.nom, Ma.marque, Etr.date, Eta.etat
FROM ETAT Eta
INNER JOIN (MATERIEL Ma INNER JOIN ETRE Etr ON Ma.id_materiel=Etr.id_materiel) ON Eta.id_etat=Etr.id_etat
ORDER BY Etr.date DESC

Edité le 03/04/2008 à 09:25

ben maintenant il me met que c’est ETRE.date qui n’en fait pas parti avec le premier et le second marche sous access pour info mais les données que j’ai saisi dans la BDD c’est pour la tester il y aurai obligatoirement plus de trois resultats :slight_smile: désolé pour mon manque de clarté je suis pas doué pour expliquer

edit pour ce probleme il s’agissait du from ==> etat n’etai pas declarer! bizarre mais bon
par contre avec le group by j’ai la liste de toutes les dates j’ai pas la liste des materiaux a la derniere date de verif :frowning: je vait peter un cable mdr

et vive access et le sql:)
Edité le 04/04/2008 à 11:35