我知道下面的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}}
答案 0 :(得分:1)
如果不深入研究代码,按COUNT或任何聚合函数的结果进行过滤,则需要使用HAVING子句。
看起来你也缺少GROUP BY条款。作为第一步,我会阅读HAVING和GROUP BY。
答案 1 :(得分:1)
您实际上非常接近您的查询。正如其他人所提到的那样,使用GROUP BY
和HAVING
,你就是那里的大部分。此外,外连接到订单并在连接中包含'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
子句的第一部分。