8768 sujets

Développement web côté serveur, CMS

Bonjour à tous.

Dans une application, je liste des éléments issus d'une table 'appareils' avec la requête MySql suivante et cela fonctionne parfaitement.
(les tables familles_appareils et fournisseurs sont négligeables dans l'exposé de mon problème)
Ces appareils sont associables à des éléments d'une table commande (un appareil peut être présent dans plusieurs commandes)





// cette requête fonctionne parfaitement
$sql_appareils = "SELECT * , (SELECT COUNT(id_app) FROM appareils) as nbr_appareils
								FROM appareils as app

								INNER JOIN familles_appareils as fam
								ON app.id_fam_app = fam.id_fam_app

								INNER JOIN fournisseurs as fourn
								ON app.id_fourn = fourn.id_labo

								ORDER BY app.id_app DESC
								LIMIT  $current_items ,  $items_per_page
								";



Maintenant je voudrais compléter ma requête pour afficher dans la liste d'appareils le nombre de commandes qui sont associées à cet appareil.
J'ai fait plein d'expérimentations avec des sous-requêtes dans l'interface de php-Myadmin pour tester, mais ça ne fonctionne pas


-- exemple de requête avec une sous-requête qui ne fonctionne pas
SELECT * , (SELECT COUNT(appareils.id_app) FROM appareils) as nbr_appareils
								FROM appareils as app ,
                                
 (SELECT commandes.id_app,
 		appareils.id_app, COUNT(commandes.id_app) 
		FROM commandes, appareils 
        	WHERE commandes.id_app = appareils.id_app) as toto 


								INNER JOIN familles_appareils as fam
								ON app.id_fam_app = fam.id_fam_app

								INNER JOIN fournisseurs as fourn
								ON app.id_fourn = fourn.id_labo

								ORDER BY app.id_app DESC;





Je ne sais pas si ce que je veux faire est possible: en fait pour chaque id_app que je récupère dans le déroulement de la requête je voudrais aller chercher le nombre de commandes qui lui correspondent.

upload/1525161063-40948-mysql-1.jpg
Modérateur
Et l'eau,

Non ce n'est pas du tout difficile. Je pense que tu t'emmêles les pinceaux. Smiley cool Dans ma piste à suivre (ci-dessous), tu n'as plus qu'à rédiger la clause WHERE (where com.appareils_id = ..... ).

Je t'ai fait un exemple plus simple :

création des tables :

CREATE TABLE appareils(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(2) NOT NULL 
);

CREATE TABLE commandes(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    date_commande DATETIME DEFAULT CURRENT_TIMESTAMP,
    appareils_id INT NOT NULL,
    FOREIGN KEY (appareils_id) REFERENCES appareils(id)
);


insertion des appareils et commandes (avec la syntaxe MariaDB/MySql) :

INSERT INTO 
    appareils (name)
VALUES
    ('A'),
    ('B'),
    ('C'),
    ('D');

INSERT INTO 
    commandes(appareils_id)
VALUES
    (1),
    (2),
    (1),
    (2),
    (3),
    (4),
    (2),
    (3);

query finale (où tu n'as plus qu'à insérer ton where) :


SELECT 
    ap.name, 
    COUNT(com.appareils_id) 
FROM 
    commandes AS com
INNER JOIN 
    appareils AS ap
ON 
    ap.id = com.appareils_id 
GROUP BY 
    com.appareils_id ;


ps : Si ton mcd/mpd (schéma) est bien fait, il faut penser simplement. Pour info, l'utilisation de sous-requêtes sont à éviter. Elles sont souvent moins performantes et tu peux facilement les résoudre avec des jointures adéquates. Smiley smile Aussi, j'ai l'impression que ton champ id_app de ta table commandes n'est pas une clef étrangère. Or, tu fais une erreur.
Modifié par niuxe (01 May 2018 - 16:05)
Modérateur
lionel_css3 a écrit :
Merci à toi niuxe,

Je t'en prie

lionel_css3 a écrit :
je vais étudier ta solution...

Si tu te crées une base temporaire et que tu copies/colles ma solution, je pense que tu devrais avoir un résultat probent et escompté Smiley smile
Modifié par niuxe (02 May 2018 - 12:54)