mysql查询修改

时间:2012-01-31 08:31:46

标签: mysql sql group-by limit aggregate

您好我写了这个查询

SELECT cl_brands.name AS Brand,DATE_FORMAT(cl_doctor_call.date_entered,'%b%y')AS MonthYear,

SUM(FIND_IN_SET(CONCAT('^',cl_brands.id,'^'),cl_doctor_call_cstm.brand_discussed_c))AS No_Times_Brand_Discussed
FROM cl_doctor_call LEFT JOIN cl_doctor_call_cstm ON
cl_doctor_call.id=cl_doctor_call_cstm.id_c 
LEFT JOIN cl_brands ON
CONCAT('^',cl_brands.id,'^') LIKE CONCAT(cl_doctor_call_cstm.brand_discussed_c, '%' )
WHERE (cl_doctor_call.date_entered)
BETWEEN CURDATE()-INTERVAL 3 MONTH AND CURDATE()
GROUP BY cl_brands.name,MonthYear
ORDER BY No_Times_Brand_Discussed DESC limit 1

此查询为我们提供了品牌名称和月份年度最高品牌。

例如:

Brand   Monthyear    No_Times_Brand_Discussed
   x       Nov11              5

现在我要展示品牌在过去2个月内讨论过“同一品牌”的详细信息(这意味着我的查询应该会在过去2个月内返回相同品牌详情的结果) 所以我的结果就是这样。

 Brand   Monthyear    No_Times_Brand_Discussed

  x       Nov11              5
  x       Oct11              0
  x       Sep11              1

告诉我如何修改上面的查询,以便它能给我这个结果。

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读这一点,那么基本上,您只需要按照日期排序前三个结果,这是最受讨论的品牌。因此,您只需要以相同的方式查询原始表,但包含一个“in”子句,这限制了您最常讨论的品牌。我使用ID而不是Name字段,因此您知道它是唯一的。我假设字段名称是“brand_id”,但它可能在您的表中有所不同。

select  cl_brands.name AS Brand,DATE_FORMAT(cl_doctor_call.date_entered,'%b%y')AS MonthYear,
SUM(FIND_IN_SET(CONCAT('^',cl_brands.id,'^'),cl_doctor_call_cstm.brand_discussed_c))AS No_Times_Brand_Discussed
from cl_doctor_call LEFT JOIN cl_doctor_call_cstm ON
cl_doctor_call.id=cl_doctor_call_cstm.id_c 
LEFT JOIN cl_brands ON
CONCAT('^',cl_brands.id,'^') LIKE CONCAT(cl_doctor_call_cstm.brand_discussed_c, '%' )
where brand_id in 
(
   SELECT c1.brand_id
   FROM cl_doctor_call LEFT JOIN cl_doctor_call_cstm ON
   cl_doctor_call.id=cl_doctor_call_cstm.id_c 
   LEFT JOIN cl_brands ON
   CONCAT('^',cl_brands.id,'^') LIKE CONCAT(cl_doctor_call_cstm.brand_discussed_c, '%' )
   WHERE (cl_doctor_call.date_entered)
   BETWEEN CURDATE()-INTERVAL 3 MONTH AND CURDATE()
   GROUP BY cl_brands.name,MonthY`enter code here`ear
) 
order by date_entered
limit 3