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;
此查询有效,但需要花费太多时间 我可以优化以上查询
答案 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
您可以尝试以上查询。我认为这是优化方式。