【问题标题】:Joining tables and making count operation - MySQL加入表并进行计数操作 - MySQL
【发布时间】:2013-01-02 16:36:03
【问题描述】:

我有这些表:

   Members
   ---------------------------
   MemberID | Name |.....
      1
      2
      3
      4
   ---------------------------

   RentedMovies
   ---------------------------
   MemberID | MovieID | DateOfLease | ReturnDate | .....
     1      |    1    |  2012-12-20 |  2013-01-05
     1      |    2    |  2012-12-15 |  2012-12-30
     1      |    3    |  2012-12-16 |  2013-01-06
     2      |    1    |  2012-12-17 |  2012-12-18
     2      |    4    |  2012-12-18 |  2013-01-05
     3      |    1    |  2012-12-19 |  2013-01-04

   I need to get this:
   --------------------------------------------------------
   MemberID | NumberOfRentedMovies | ReturnData < curdate())
     1      |         3            |      1
     2      |         2            |      1
     3      |         1            |      0
     4      |         0            |      0
   ---------------------------------------------------------

我使用了下一个代码:

   SELECT  Members.MemberID,
    COUNT(rented.MemberID) AS NumberOfRentedMovies,
    COUNT(notTakenBackOnTime.idClana) AS NumberOfMoviesLate
   FROM  Members 
   left JOIN RentedMovies as rented ON  rented.MemberID = Members.MemberID
   left JOIN RentedMovies as notTakenBackOnTime ON notTakenBackOnTime.MemberID
       = Members.MemberID AND notTakenBackOnTime.ReturnDate< CURDATE()
   group by Members.MemberID

但它不正确地工作!

我也试过这个:

   SELECT MemberID,my,my2
   FROM Members as mem
   JOIN (SELECT COUNT(* )AS my FROM RentedMovies) b 
      ON b.MemberID = mem.MemberID
   JOIN (SELECT COUNT(* )AS my2 FROM RentedMovies WHERE ReturnDate< CURDATE()) c 
   ON c.MemberID = mem.MemberID

但是我遇到了一些错误! 那么问题是如何完成正确的解决方案?

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:

    你很亲密。试试这个:

    SELECT  M.MemberID, 
            COUNT(RM.MemberID) NumberOfRentedMovies,
            SUM(CASE WHEN RM.ReturnDate < CURDATE() THEN 1 ELSE 0 END) ReturnData 
    FROM Members M
    LEFT JOIN RentedMovies RM
        ON M.MemberID = RM.MemberID 
    GROUP BY M.MemberID 
    

    【讨论】:

    • @bluefeet 感谢您的提琴
    • 我希望会员 4 不用为租用 NULL 这么长时间而支付大笔费用。 ;) 将 * 更改为 RentedMovies
    • 我如何过滤结果,以便我获得租用特定 ID 电影的会员?
    • 我不同意@AndreKR 并且喜欢 Lamak 的回答方式。
    • 什么?抱歉,OP 的示例清楚地表明,从未租借过电影的成员的 NumberOfRentedMovies 应该为 0 而不是 1。
    【解决方案2】:

    您显示的预期结果可以通过以下方式实现:

    SELECT MemberID,
           COALESCE(COUNT(MovieID), 0) AS NumberOfRentedMovies,
           COALESCE(SUM(ReturnDate < CURDATE()), 0) AS NotYetReturned
    FROM Members
    LEFT JOIN RentedMovies USING (MemberID)
    GROUP BY MemberID
    

    查看实际操作:http://sqlfiddle.com/#!2/a192c/1

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多