Mysql запрос справки - PullRequest
       27

Mysql запрос справки

0 голосов
/ 21 октября 2010

Моя система состоит из двух типов пользователей - студентов и преподавателей.
- Репетиторы могут создавать классы и пакеты
- Студенты и преподаватели могут приобрести классы и пакеты

Ниже приведены таблицы

Groups
Users - Содержит общие поля обоих типов пользователей
Tutor_Details - Поля для репетитора
WebClasses - классы, созданные преподавателями
Learning_Packs - пакеты, созданные преподавателями Orders - Одна запись на покупку
Order_Details - Несколько записей на покупку - столько же предметов в покупке
Payments

Следующий запрос создает список всех пользователей (студентов и преподавателей) и отображает 3 поля: «Имя пользователя», orders - количество купленных предметов и topics - общее количество созданных классов и пакетов -

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 

Требуется помощь
Теперь я хочу добавить еще один фильтр / условие к подсчету topics. Следует учитывать только те темы, для которых wc.status = 1 или lp.status = 1. Я хочу сделать то же самое в одном запросе. Обратите внимание, что условие не может быть добавлено в основной блок where (перед групповым блоком), поскольку в запросе все равно должны отображаться учащиеся (которые не посещали ни одного класса) и преподаватели, которые посещали занятия с id_status = 0.

Счет topics должен учитывать только условие классов / пакетов, это все, что я хочу. В запросе все равно должны отображаться все пользователи, отображаемые в текущем запросе.

Спасибо
Sandeepan

1 Ответ

0 голосов
/ 21 октября 2010

Хорошо, я нашел решение сам, прежде чем кто-либо еще:)

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  
...