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