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

时间:2013-04-08 20:37:50

标签: mysql sql

我知道下面的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

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

{{1}}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您实际上非常接近您的查询。正如其他人所提到的那样,使用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

如果要将其包含在GROUP BY中,则必须在SELECT中包含用户表中的其他列。此外,它可能只是一个疏忽,但您也需要>= 6(而不是> 6)作为HAVING子句的第一部分。