我目前有一个类似的查询:
SELECT * AS totalCustomers FROM customers LEFT JOIN belongings USING (customer_id) WHERE belonging_id BETWEEN 1 AND 5;
我想知道我是否可以修改它,以便通过将其修改为以下内容来返回表客户中的记录总数:
SELECT *, COUNT(DISTINCT customer_id) AS totalCustomers FROM customers LEFT JOIN belongings USING (customer_id) WHERE belonging_id BETWEEN 1 AND 5;
我计划将总数用于分页,但是希望将其作为查询的一部分,这样我就不必再次调用数据库来获取总数。这是可能的,还有更好的方法吗?
答案 0 :(得分:0)
对于分页,如果您使用的是LIMIT
,则可以使用SQL_CALC_FOUND_ROWS
答案 1 :(得分:0)
我认为更好,更正确的方法是进行第二次查询。如果你想获得总记录数,那么你应该向你的customers表做子查询,但没有“where”指令。如果您在主查询中执行此操作,则子查询将执行与主查询返回的行数相同的次数。
答案 2 :(得分:0)
使用临时表可以解决这种情况。虽然这是第二个查询,但它从昂贵的连接操作中节省了:
CREATE TEMPORARY TABLE TMP
SELECT *, customer_id as tmp_customer_id
FROM customers LEFT JOIN belongings USING (customer_id)
WHERE belonging_id BETWEEN 1 AND 5;
您仍然可以从您创建的临时表中获取结果:
SELECT * FROM TMP;
之后您将获得客户数量:
SELECT COUNT(DISTINCT tmp_customer_id) FROM TMP;
答案 3 :(得分:0)
好的,我找到了我现在正在寻找的解决方案。我设法使用子查询来计算customers表中的客户总数:
SELECT * FROM
(SELECT COUNT(DISTINCT customer_id) FROM customers AS totalUniqueCustomers ) tmp,
customers c
LEFT JOIN
belongings USING (customer_id)
WHERE
belonging_id BETWEEN 1 AND 5;
现在我拥有来自整个客户表的唯一客户总数,但也限制了之后用于加入的记录范围。