繁体   English   中英

MySQL连接表并计算where子句中的行数

[英]MySQL joining tables and counting the number of rows in where clause

我知道下面的SQL语句是完全错误的,但我希望它给出了我想要做的一个例子。 我有一个用户表,一个付款(用户付款而非订单付款)表和一个订单表。 我想选择已经向我们支付了6笔或更多笔款的10名随机用户,他们还没有订购任何订单。

在付款表中,每个用户为他们所做的每笔付款都有多行。 在订单表中它是相同的,但它包含已完成和未完成的订单,我正在寻找没有任何已完成订单的用户,因此订单表中的所有订单的o.order_status必须为0

我希望这是有道理的,如果您需要更多信息让我知道,我会更新帖子。 感谢帮助。

SELECT u.*, COUNT(p.id) as payment_count, COUNT(o.id) as order_count
                    FROM users as u
                    INNER JOIN payments as p
                    ON u.id = p.user_id
                    INNER JOIN orders as o
                    ON u.id = o.user_id
                    WHERE o.order_status = 0
                    AND COUNT(p.id) > 6
                    AND COUNT(o.id) = 0
                    ORDER BY RAND()
                    LIMIT 10

如果不深入研究代码,按COUNT或任何聚合函数的结果进行过滤,则需要使用HAVING子句。

看起来你也缺乏GROUP BY条款。 作为第一步,我会阅读HAVING和GROUP BY。

你的查询实际上非常接近。 正如其他人所提到的,使用GROUP BYHAVING ,你就是那里的大部分。 此外,外部联接到订单并在联接中包含“order_status = 0”检查以帮助完成“无状态为零的订单”要求。 结果:

SELECT 
    u.id, 
    COUNT(p.id) as payment_count, 
    COUNT(o.id) as order_count
FROM users as u
    INNER JOIN payments as p
        ON u.id = p.user_id
    LEFT OUTER JOIN orders as o
        ON u.id = o.user_id
            AND o.order_status = 0
GROUP BY u.id
HAVING COUNT(p.id) >= 6
    AND COUNT(o.id) = 0
ORDER BY RAND()
LIMIT 10

如果要将它们包含在SELECT中,则必须在GROUP BYusers表中包含其他列。 此外,它可能只是一个疏忽,但你也希望HAVING子句的第一部分>= 6 (不是> 6 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM