[英]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 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
如果要将它们包含在SELECT
中,则必须在GROUP BY
的users表中包含其他列。 此外,它可能只是一个疏忽,但你也希望HAVING
子句的第一部分>= 6
(不是> 6
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.