【问题标题】:MYSQL query with two different join and count具有两个不同连接和计数的 MYSQL 查询
【发布时间】:2014-06-10 16:34:17
【问题描述】:

我有两个不同的查询可以单独使用。第一个给了我有用的结果列TOTALI,第二个查询列RIMBORSATI。所以我需要将第一个查询与第二个查询合并,并使第一个查询的 HAVING 子句是一个类似 HAVING totali-rimborsati < professionisti.limite 的操作。

非常感谢。

第一次查询:

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

【问题讨论】:

    标签: mysql sql join count


    【解决方案1】:
    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 
    

    【讨论】:

    • :-( [Err] 1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 'AS rimborsati ORDER BY totali ASC LIMIT 附近使用的正确语法4' 在第 7 行,如果我还删除了 HAVING 子句查询工作,但在列 totali 和 rimborsi 上具有相同的值并且是错误的。
    • 不再工作 :-( 删除有子句我将自己恢复....无论如何,如果我也删除 HAVING 子句查询工作但在列 totali 和 rimborsi 上具有相同的值并且是错误的。
    • 例如,如果我单独运行第一个查询,totali 为 10,第二个查询 rimborsati 为 3,但这样我在两列中都有 39 :-(
    • 现在可以试试,告诉我你得到了什么?
    • 根本不起作用我还删除了professionalisti.column1作为column1.....等....给我语法在'(选择professionalisti.email作为电子邮件,COUNT(contatti_rimborsi。电子邮件)作为 rimborsa' 在第 16 行
    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:
         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
      

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        相关资源
        最近更新 更多