【问题标题】:Need to Combine Query with Distinct and Count需要将 Query 与 Distinct 和 Count 结合起来
【发布时间】:2012-06-06 07:05:47
【问题描述】:

我有一个正在尝试清理的查询:

我原来的查询如下:

SELECT h.userid, c.firstname, c.lastname, h.domain, h.nextduedate, h.domainstatus, 
    (SELECT COUNT(status) 
     FROM tblinvoices i, tblinvoiceitems ii
     WHERE i.userid =h.userid
            AND i.id = ii.invoiceid
        AND i.STATUS LIKE  'Unpaid'
        AND i.TOTAL = 80
        AND ii.description LIKE  'Hosted Domain%')
     AS invoice_count 
 FROM tblclients c, tblhosting h 
 WHERE h.userid=c.id AND c.status='Active' 
    AND c.id NOT IN (1,2,3,4,5)
    AND h.domain LIKE '%thisdomain.com' 
    AND h.nextduedate<='2012-06-06' 
 ORDER BY h.domainstatus, h.nextduedate DESC

它运作良好,但并非 100% 准确。我让所有用户的“nextduedate”早于今天的日期,但是,有些用户的未付发票的 nextduedate 为 NULL(帐户已取消,但他们仍有未付发票)。

这个查询给了我 22 个用户,但是如果我运行:

SELECT DISTINCT i.userid, COUNT(i.status) 
     FROM tblinvoices i, tblinvoiceitems ii
     WHERE i.id = ii.invoiceid
        AND i.STATUS LIKE  'Unpaid'
        AND i.TOTAL = 80
        AND ii.description LIKE  'Hosted Domain%')

然后我得到了 26 个用户(以及大约 8 张丢失的发票)。

下一个到期日期实际上是显示他们有多晚,此查询的主要重点是显示所有未付发票的用户。我尝试以几种不同的方式将第二个查询与第一个查询结合起来,但我无法弄清楚,我想我锁定了我的服务器。

理想情况下,我的返回行应该是这样的:

userid、firstname、lastname、domain、domainstatus、“duedate”(理想情况下这是最早发票的日期,我使用 nextduedate 是因为它很简单)、invoicecount(未付发票的数量)

仅供参考,发票日期在 i.invoicedate 中

非常感谢帮助我弄清楚如何优化此查询!

【问题讨论】:

    标签: mysql select count distinct


    【解决方案1】:

    您可以尝试将DISTINCT 替换为GROUP BY

    SELECT h.userid, c.firstname, c.lastname, h.domain, h.nextduedate, h.domainstatus, count(i.status) AS invoice_count
    
    FROM tblclients c, tblhosting h 
    LEFT JOIN tblinvoices i ON i.userid =h.userid         
        AND i.STATUS LIKE  'Unpaid'
        AND i.TOTAL = 80
    LEFT JOIN tblinvoiceitems ii ON i.id = ii.invoiceid
        AND ii.description LIKE  'Hosted Domain%'
    
    
    WHERE h.userid=c.id AND c.status='Active' 
        AND c.id NOT IN (1,2,3,4,5)
        AND h.domain LIKE '%thisdomain.com' 
        AND h.nextduedate<='2012-06-06'
    GROUP BY h.userid 
    ORDER BY h.domainstatus, h.nextduedate DESC
    

    【讨论】:

    • 我可以看到对发送查询进行了更改,但该查询本身已经起作用。当我合并这两个查询时,我尝试使用 GROUP BY,但我无法弄清楚如何正确地为我提供所需的所有信息。实际上,除了原始查询中的 COUNT(状态)之外,我从来没有让它与其他任何东西一起工作。
    • 这是我尝试结合两个查询SELECT h.userid, c.firstname, c.lastname, h.domain, h.nextduedate, h.domainstatus, i.userid, COUNT(i.status) FROM tblclients c, tblhosting h, tblinvoices i, tblinvoiceitems ii WHERE h.userid=c.id AND c.status='Active' AND c.id NOT IN (1,2,3,4) AND h.domain LIKE '%domain.com' AND i.userid =h.userid AND i.id = ii.invoiceid AND i.STATUS LIKE 'Unpaid' AND i.TOTAL = 80 AND ii.description LIKE 'Hosted%' AND h.nextduedate&lt;='2012-06-06' GROUP BY i.userid ORDER BY h.domainstatus, h.nextduedate DESC
    • 太棒了!非常感谢,我用了你给我的东西,更进一步拉出了第一张发票的到期日期!谢谢!!
    猜你喜欢
    • 2011-11-17
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2012-09-16
    • 1970-01-01
    • 2018-07-27
    • 2021-04-19
    相关资源
    最近更新 更多