如何在查询中使用join来从多个子查询中获取数据

时间:2017-08-09 08:27:02

标签: mysql

    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-07-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;

此查询有效,但需要花费太多时间 我可以优化以上查询

2 个答案:

答案 0 :(得分:0)

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

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" 
targetNamespace="urn:company.Namespace" >
    <xs:element name="company">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:string" name="companyname"/>
                <xs:element type="xs:string" name="address"/>

                <xs:element name="department">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element type="xs:string" name="dname"/>
                            <xs:element type="xs:short" name="deptphoneno"/>
                            <xs:element type="xs:short" name="deptfaxno"/>
                            <xs:element type="xs:string" name="deptemail"/>

                            <xs:element name="employee">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element type="xs:short" name="empid"/>
                                        <xs:element type="xs:string" name="ename"/>
                                        <xs:element type="xs:string" name="emailid"/>
                                        <xs:element type="xs:short" name="phoneno"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>

                            <xs:element name="contractemployee">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element type="xs:string" name="name"/>
                                        <xs:element type="xs:short" name="phoneno"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>

                        </xs:sequence>
                    </xs:complexType>
                </xs:element>    
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

答案 1 :(得分: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

您可以尝试以上查询。我认为这是优化方式。