我有这个问题:
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
正如您所看到的,UNION ALL有两个查询。
现在我的问题是:我如何计算每个查询?如何检索每个计数值?我想查询1号的计数结果和查询号2的计数结果。
更新: 我想得到一个这样的计数结果:数1:34,数为2:45
答案 0 :(得分:2)
如果要计算两个子查询中返回的行,请执行以下操作:
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];
编辑:
要在限制之后执行此操作,请将当前查询作为子查询并执行计数:
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;
在应用程序级别计算ord
列可能更容易。
答案 1 :(得分:1)
你可能想试试这个:
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;
这意味着像对待桌子一样处理你所有的联合并计算所有元素。