简体   繁体   English

如何使用UNION ALL计算两个查询

[英]How to count two queries with UNION ALL

I have this query: 我有这个查询:

    SELECT ava_users.*, 0 AS ord
    FROM ava_friend_requests
    LEFT JOIN ava_users 
    ON ava_friend_requests.from_user = ava_users.id
    WHERE ava_friend_requests.to_user = $user[id]
    UNION ALL
    SELECT ava_users.*, 1 AS ord
    FROM ava_friends
    LEFT JOIN ava_users 
    ON ava_friends.user2 = ava_users.id
    WHERE ava_friends.user1 = $user[id]
    ORDER BY ord
    LIMIT $from, $display_num

As you can see there are two queries with a UNION ALL. 如您所见,有两个UNION ALL查询。

Now my question is: How do I count EACH query? 现在我的问题是:如何计算每个查询? How can I retrieve each count value? 如何获取每个计数值? I'd like to have a count result for query no 1 and a count result for query no2. 我想要查询1的计数结果和查询2的计数结果。

UPDATE: I would like to have a counting result like this: count 1: 34, count 2: 45 更新:我想有一个这样的计数结果:计数1:34,计数2:45

See here: select count from multiple tables 参见此处: 从多个表中选择计数

If you want to count the returned rows from the two subqueries, how about this: 如果要计算两个子查询返回的行,该如何处理:

SELECT 'Query1' as which, count(*) as cnt
FROM ava_friend_requests
LEFT JOIN ava_users 
ON ava_friend_requests.from_user = ava_users.id
WHERE ava_friend_requests.to_user = $user[id]
UNION ALL
SELECT 'Query2', count(*)
FROM ava_friends
LEFT JOIN ava_users 
ON ava_friends.user2 = ava_users.id
WHERE ava_friends.user1 = $user[id];

EDIT: 编辑:

To do this after the limit, make the current query a subquery and do the counting: 要在限制之后执行此操作,请将当前查询设为子查询并进行计数:

select ord, count(*) as cnt
from (SELECT ava_users.*, 0 AS ord
      FROM ava_friend_requests
      LEFT JOIN ava_users 
      ON ava_friend_requests.from_user = ava_users.id
      WHERE ava_friend_requests.to_user = $user[id]
      UNION ALL
      SELECT ava_users.*, 1 AS ord
      FROM ava_friends
      LEFT JOIN ava_users 
      ON ava_friends.user2 = ava_users.id
      WHERE ava_friends.user1 = $user[id]
      ORDER BY ord
      LIMIT $from, $display_num
     ) t
group by ord;

It also might be easier just to count the ord column at the application level. 仅在应用程序级别计算ord列也可能会更容易。

You may want to try this: 您可能要尝试以下操作:

select count(*) from (SELECT ava_users.*, 0 AS ord
FROM ava_friend_requests
LEFT JOIN ava_users 
ON ava_friend_requests.from_user = ava_users.id
WHERE ava_friend_requests.to_user = $user[id]
UNION ALL
SELECT ava_users.*, 1 AS ord
FROM ava_friends
LEFT JOIN ava_users 
ON ava_friends.user2 = ava_users.id
WHERE ava_friends.user1 = $user[id]
ORDER BY ord
LIMIT $from, $display_num) as users;

This means to deal with you union all like a table and count all the elements. 这意味着要像对待表一样处理所有并统计所有元素。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM