2017-08-09 230 views
0
SELECT dates, 
      SUM(Total_Likes) AS Total_likes, 
      SUM(Real_Like) AS Real_Like, 
      SUM(Secret_like) AS Secret_like 
    FROM 
    (
    SELECT CAST(added_datetime AS DATE) AS dates, 
      SUM(IF(like_flag=1,1,-1)) AS Total_Likes, 

     ( 
      SELECT SUM(IF(like_flag=1,1,-1)) 
      FROM like_message_audit_log la 
      WHERE user_profile_type=1 AND CAST(added_datetime AS DATE)= '2017-07-21' 
      AND like_mode IN(1,2) 
      GROUP BY user_profile_id_fk 
      ) AS Real_Like, 
      (

      SELECT SUM(IF(like_flag=1,1,-1)) 
      FROM like_message_audit_log la 
      WHERE user_profile_type=2 AND CAST(added_datetime AS DATE)= '2017-07-21' 
      AND like_mode IN(1,2) 
      GROUP BY user_profile_id_fk 
      )AS Secret_like 

     FROM like_message_audit_log la 
     WHERE CAST(added_datetime AS DATE)= '2017-07-21' 
     AND like_mode IN(1,2) 
    )AS t 
    GROUP BY dates; 

上面的查询只运行了一个日期获取数据,但我想两个日期 之间运行的日期范围如何编写查询请建议如何在查询中使用联接从多个子查询

像上述查询的输出是: 日期TOTAL_LIKES Real_Like Secret_like 2017年7月21日16 15 1

我重写上述查询等:

 SELECT dates, 
    SUM(Total_Likes) AS Total_likes, 
    SUM(real_likes_count) AS Real_Like, 
    SUM(secret_likes_count) AS Secret_like 
    FROM 
    (
    SELECT 
     CAST(added_datetime AS DATE) AS Dates, 
     like_mode AS modes, 
     COUNT(CASE WHEN like_flag=1 THEN 1 END) AS Total_Likes, 
     COUNT(CASE WHEN like_flag=1 AND user_profile_type=1 THEN 1 END) AS real_likes_count, 
     COUNT(CASE WHEN like_flag=1 AND user_profile_type=2 THEN 1 END) AS secret_likes_count 
    FROM like_message_audit_log la 
    WHERE added_datetime IN 
      ( SELECT MAX(lb.added_datetime) AS added_datetime 
       FROM like_message_audit_log lb 
       WHERE la.user_profile_id_fk=la.user_profile_id_fk AND lb.message_unique_id_fk=la.message_unique_id_fk 
       GROUP BY user_profile_id_fk, message_unique_id_fk 
      ) 
    GROUP BY CAST(added_datetime AS DATE) 


    )AS t 

    WHERE dates BETWEEN '2017-07-21' AND '2017-08-04' 
     AND modes IN(1,2) 
    GROUP BY Dates 
    ORDER BY Dates DESC; 

此查询工作,但花太多时间 我可以优化上面的查询

+0

尝试谷歌'之间' – RealCheeseLord

+1

那些'SELECT SUM(...)'子查询将无法正常工作。当你使用'SELECT'作为一个值时,它必须返回一行。 – Barmar

+0

@Barmar完美之一.. !! –

回答

0

https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_between

SELECT dates, 
      SUM(Total_Likes) AS Total_likes, 
      SUM(Real_Like) AS Real_Like, 
      SUM(Secret_like) AS Secret_like 
    FROM 
    (
    SELECT CAST(added_datetime AS DATE) AS dates, 
      SUM(IF(like_flag=1,1,-1)) AS Total_Likes, 

     ( 
      SELECT SUM(IF(like_flag=1,1,-1)) 
      FROM like_message_audit_log la 
      WHERE user_profile_type=1 AND CAST(added_datetime AS DATE) BETWEEN '2017-07-21' AND '2017-07-27' 
      AND like_mode IN(1,2) 
      GROUP BY user_profile_id_fk 
      ) AS Real_Like, 
      (

      SELECT SUM(IF(like_flag=1,1,-1)) 
      FROM like_message_audit_log la 
      WHERE user_profile_type=2 AND CAST(added_datetime AS DATE) BETWEEN '2017-07-21' AND '2017-07-27' 
      AND like_mode IN(1,2) 
      GROUP BY user_profile_id_fk 
      )AS Secret_like 

     FROM like_message_audit_log la 
     WHERE CAST(added_datetime AS DATE) BETWEEN '2017-07-21' AND '2017-07-27' 
     AND like_mode IN(1,2) 
    )AS t 
    GROUP BY dates; 
+1

也许需要更改所有的子查询。 – Barmar

0
SELECT added_datetime,user_profile_id_fk, 
SUM(CASE WHEN user_profile_type=1 THEN 1 ELSE 0 END) AS Real_Like, 
SUM(CASE WHEN user_profile_type=2 THEN 1 ELSE 0 END) AS Secret_like, 
SUM(1) AS Total_likes 
FROM like_message_audit_log la 
WHERE CAST(added_datetime AS DATE) BETWEEN '2016-07-21' AND '2018-07-21' 
AND like_mode IN(1,2) 
GROUP BY user_profile_id_fk,added_datetime 

您可以检查此Fiddle Demo

你可以试试上面的查询。我认为这是优化的方式。

+0

这个查询不会给我正确的计数 – mansi

+0

@MansiChaudhari你可以创建sqlfiddle演示吗? –

+0

@MansiChaudhari我曾试过用我的数据.. 它的响应正常。 –