2010-10-21 21 views
0

Mon système se compose de deux types d'utilisateurs - Etudiants et tuteurs.
- Tuteurs peuvent créer des classes et des packs
- Les étudiants et les tuteurs peuvent acheter des cours et des packsMysql query help

Voici les tables impliquées

Groups
Users - Contient des champs communs des deux types d'utilisateurs
Tutor_Details - Champs spécifiques au tuteur
WebClasses - Classes créées par les tuteurs
Learning_Packs - Packs créés par tuteurs Orders - Un enregistrement par achat
Order_Details - Plusieurs enregistrements par achat - autant d'articles dans l'achat
Payments

La requête suivante produit la liste de tous les utilisateurs (étudiants et tuteurs) et affiche le 3 utilisateur Fields- nom, orders - nombre d'articles achetés et topics - nombre total de classes et des packs créés -

SELECT u.name, 
     COUNT(DISTINCT(o.id_order))           AS 
     orders, 
     ((COUNT(DISTINCT(wc.id_wc))) + (COUNT(DISTINCT(lp.id_lp)))) AS 
     topics 
FROM users AS u 
     LEFT JOIN tutor_details AS td 
     ON u.id_user = td.id_user 
     INNER JOIN groups AS g 
     ON u.id_group = g.id_group 
     LEFT JOIN webclasses AS wc 
     ON td.id_tutor = wc.id_author 
     LEFT JOIN learning_packs AS lp 
     ON td.id_tutor = lp.id_author 
     LEFT JOIN orders AS o 
     ON (u.id_user = o.id_user) 
     LEFT JOIN order_details AS od 
     ON (o.id_order = od.id_order) 
     LEFT JOIN payments AS p 
     ON (o.id_order = p.id_order) 
WHERE IF(o.id_order != 0, o.order_status = 'paid', 1) 
     AND IF(p.id_payment != 0, p.payment_status = 'success', 1) 
GROUP BY u.id_user 
ORDER BY u.id_user ASC 

aide nécessaireMaintenant, je veux ajouter un autre filtre/condition au comptage topics. Seuls ces sujets doivent être comptés pour lesquels wc.status = 1 ou lp.status = 1. Je souhaite faire la même chose dans une seule requête. Veuillez noter que la condition ne peut pas être ajoutée à l'intérieur du bloc où block (avant le groupe) car la requête doit toujours afficher les étudiants (qui n'ont pas suivi de cours) et les tuteurs qui ont suivi les classes avec id_status = 0.

topics count ne devrait considérer que la condition classes/packs, c'est tout ce que je veux. La requête doit toujours afficher tous les utilisateurs tels qu'affichés par la requête actuelle.

Merci,
Sandeepan

Répondre

0

D'accord, je me suis trouvé la solution avant tout le monde :)

SELECT u.id_user, 
     (Concat(u.name, ' ', u.surname))        AS name 
     , 
     u.login, 
     u.status, 
     u.email, 
     g.name               AS TYPE 
     , 
     u.joined, 
     COUNT(DISTINCT(o.id_order))          AS 
     orders, 
     (COUNT(DISTINCT(IF(wc.id_status = 1, wc.id_wc, NULL))) + 
      COUNT(DISTINCT(IF(lp.id_status = 1, lp.id_lp, NULL)))) AS 
     topics 
FROM users AS u 
     LEFT JOIN tutor_details AS td 
     ON u.id_user = td.id_user 
     INNER JOIN groups AS g 
     ON u.id_group = g.id_group 
     LEFT JOIN webclasses AS wc 
     ON td.id_tutor = wc.id_author 
     LEFT JOIN learning_packs AS lp 
     ON td.id_tutor = lp.id_author 
     LEFT JOIN orders AS o 
     ON (u.id_user = o.id_user) 
     LEFT JOIN order_details AS od 
     ON (o.id_order = od.id_order) 
     LEFT JOIN payments AS p 
     ON (o.id_order = p.id_order) 
WHERE IF(o.id_order != 0, o.order_status = 'paid', 1) 
     AND IF(p.id_payment != 0, p.payment_status = 'success', 1) 
GROUP BY u.id_user 
ORDER BY u.id_user ASC