0

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

在支付表中,对于每个用户进行的每次付款,都有多行。在订单表中它是相同的,但它包含已完成和未完成的订单,我正在寻找没有任何已完成订单的用户,因此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
4

2 回答 2

1

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

看起来您也缺少 GROUP BY 子句。作为第一步,我会阅读 HAVING 和 GROUP BY。

于 2013-04-08T20:40:36.463 回答
1

您实际上与您的查询非常接近。正如其他人所提到的,使用GROUP BYandHAVING并且你是那里的大部分。此外,外连接到订单并在连接中包含“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(not > 6) 条款的第一部分HAVING

于 2013-04-08T21:20:39.810 回答