具有两种不同连接和计数的MYSQL查询

具有两种不同连接和计数的MYSQL查询,mysql,sql,join,count,Mysql,Sql,Join,Count,我有两个单独运行良好的不同查询。第一个给了我有用的结果列TOTALI和第二个查询列RIMBORSATI。所以我需要将第一个查询与第二个查询合并,并使第一个查询的HAVING子句是一个类似HAVING totali rimborsati

我有两个单独运行良好的不同查询。第一个给了我有用的结果列TOTALI和第二个查询列RIMBORSATI。所以我需要将第一个查询与第二个查询合并,并使第一个查询的HAVING子句是一个类似HAVING totali rimborsati 非常感谢你

第一个问题:


:-[Err]1064-您的SQL语法有错误;如果我删除了HAVING子句查询工作,但totali和rimborsi列上的值相同且错误,请检查与您的MySQL服务器版本相对应的手册,以了解在第7行使用near“AS rimborsati ORDER BY TOTALLI ASC LIMIT 4”的正确语法。不再工作:-删除HAVING子句我将自己还原…无论如何,如果我删除了HAVING子句也有子句查询工作,但在列totali和rimborsi上有相同的值并且是错误的。例如,如果我单独运行第一个查询totali是10,在第二个查询rimborsati是3,但在这两个列中我都有39:-现在可以尝试一下,让我知道你得到了什么吗?根本不工作,我还将professionisti.column1作为column1删除。。。。。,等请给出第16行“选择professionisti.email作为电子邮件,countcontati_rimborsi.email作为rimborsa”附近的语法
SELECT professionisti.*,COUNT(contatti_acquistati_addebito.email) AS totali  
FROM professionisti
   LEFT JOIN contatti_acquistati_addebito ON
             professionisti.email = contatti_acquistati_addebito.email
           AND contatti_acquistati_addebito.DATA
               BETWEEN ('2014-05-01') AND  ('2014-05-31')
   WHERE professionisti.categoria LIKE '%0540%' AND 
         professionisti.province LIKE '%MI%'  
         AND   professionisti.addebito='1'
GROUP BY professionisti.email
HAVING totali  < professionisti.limite
ORDER BY totali ASC LIMIT 4
SELECT professionisti.*,COUNT(contatti_rimborsi.email) AS rimborsati  
FROM professionisti
LEFT JOIN contatti_rimborsi ON professionisti.email = contatti_rimborsi.email AND 
            contatti_rimborsi.DATA BETWEEN ('2014-05-01') AND  ('2014-05-31')
WHERE professionisti.categoria LIKE '%0540%'
      AND professionisti.province LIKE '%MI%'  
      AND professionisti.addebito='1'
GROUP BY professionisti.email
ORDER BY totali ASC LIMIT 4
select sq1.*,sq2.rimborsati  
from 
(SELECT professionisti.email as email, professionisti.categoria as categoria,professionisti.province as province,professionisti.addebito as addebito, COUNT(contatti_acquistati_addebito.email) AS totali  
FROM professionisti
   LEFT JOIN contatti_acquistati_addebito ON
             professionisti.email = contatti_acquistati_addebito.email
           AND contatti_acquistati_addebito.DATA
               BETWEEN ('2014-05-01') AND  ('2014-05-31')
   WHERE professionisti.categoria LIKE '%0540%' AND 
         professionisti.province LIKE '%MI%'  
         AND   professionisti.addebito='1'
GROUP BY professionisti.email
HAVING totali  < professionisti.limite
ORDER BY totali ASC LIMIT 4) sq1,

(SELECT professionisti.email as email, professionisti.categoria as categoria,professionisti.province as province,professionisti.addebito as addebito, COUNT(contatti_rimborsi.email) AS rimborsati  
FROM professionisti
LEFT JOIN contatti_rimborsi ON professionisti.email = contatti_rimborsi.email AND 
            contatti_rimborsi.DATA BETWEEN ('2014-05-01') AND  ('2014-05-31')
WHERE professionisti.categoria LIKE '%0540%'
      AND professionisti.province LIKE '%MI%'  
      AND professionisti.addebito='1'
GROUP BY professionisti.email
ORDER BY totali ASC LIMIT 4) sq2
where sq1.email=sq2.email and totali <rimborsati 
select t1.email,t1.limite,t1.totali,t2.rimborsati
from (
  SELECT professionisti.email,
    max(professionisti.limite) as limite,
    min(COUNT(contatti_acquistati_addebito.email) AS totali  
  FROM professionisti
     LEFT JOIN contatti_acquistati_addebito ON
             professionisti.email = contatti_acquistati_addebito.email
             AND contatti_acquistati_addebito.DATA
                 BETWEEN ('2014-05-01') AND  ('2014-05-31')
   WHERE professionisti.categoria LIKE '%0540%' AND 
             professionisti.province LIKE '%MI%'  
             AND professionisti.addebito='1'
   GROUP BY professionisti.email
   -- Here that professionisti.limite does make sense to me it should be an aggregate function!?
   -- (are you sure this query works?)
   -- using max(professionisti.limite) and using the aggregate count for email
   HAVING COUNT(contatti_acquistati_addebito.email)  < max(professionisti.limite)
   -- using aggregate more general sql (works better on other engines)
   -- removed see why below.
   -- ORDER BY COUNT(contatti_acquistati_addebito.email) ASC LIMIT 4
) t1
  left join (
    SELECT professionisti.email,COUNT(contatti_rimborsi.email) AS rimborsati  
    FROM professionisti
    LEFT JOIN contatti_rimborsi ON professionisti.email = contatti_rimborsi.email AND 
            contatti_rimborsi.DATA BETWEEN ('2014-05-01') AND  ('2014-05-31')
    WHERE professionisti.categoria LIKE '%0540%'
            AND professionisti.province LIKE '%MI%'  
            AND professionisti.addebito='1'
    GROUP BY professionisti.email
    -- Here you cannot order by totali you do not have it so I am removing both order by
    -- alternativly put the same left join with contatti_acquistati_addebito as above!
    -- ORDER BY totali ASC LIMIT 4
) t2 on t1.email=t2.email
where ,t1.totali-t2.rimborsati  < t1.limite
   SELECT p.*,m1.*,m2.*,IFNULL(m2.rimborsi, 0) as rimborsiok
  FROM professionisti p
  LEFT JOIN
  (
    SELECT ca.email, COUNT(*) AS totali
    FROM contatti_acquistati_addebito ca
                WHERE ca.data between ('2014-06-01') AND  ('2014-06-31')
    GROUP BY ca.email
  ) AS m1 ON p.email = m1.email
  LEFT JOIN
  (
    SELECT cr.email, COUNT(*) AS rimborsi
    FROM contatti_rimborsi cr
    WHERE cr.data between ('2014-06-01') AND  ('2014-06-31')
    GROUP BY cr.email
  ) AS m2 ON p.email = m2.email
WHERE p.categoria LIKE '%0540%' AND p.province LIKE '%MI%'  AND p.standby='0' AND p.addebito='1'
HAVING  m1.totali-rimborsiok<p.limite OR p.limite=0