【问题标题】:Mysql query helpMysql查询帮助
【发布时间】:2011-04-28 12:37:37
【问题描述】:

我的系统包含两种用户类型 - 学生和导师。
- 导师可以创建课程和包
- 学生和导师都可以购买课程和包

以下是涉及的表格

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 的那些主题。我希望在单个查询中做同样的事情。请注意,不能将条件添加到 main where 块内(在 group 块之前),因为查询仍然必须显示学生(没有上过任何课)和上过课 id_status = 0 的导师。

topics 计数应该只考虑类/包条件,这就是我想要的。该查询仍应显示当前查询所显示的所有用户。

谢谢,
桑迪潘

【问题讨论】:

    标签: mysql count conditional sum join


    【解决方案1】:

    好的,我自己比其他人先找到了解决方案 :)

    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  
    

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多