首先,我有以下sql语句:
SELECT * FROM members
WHERE username IN (
SELECT friend2 as username FROM list_friends
WHERE (friend1 = 'user' AND friend2 <> 'user')
UNION
SELECT friend1 as username FROM list_friends
WHERE (friend2 = 'user' AND friend1 <> 'user')
)
上面的代码运行得很好。它返回“members”表中与给定用户的朋友列表匹配的所有行,该列表是通过在表list_friends中搜索给定用户并从列friend1或friend2中获取朋友名称来创建的。
就像我说的,它工作得天衣无缝。
接下来,我有以下sql语句:
SELECT username,
(SELECT COUNT(*) FROM sites WHERE username = 'user')
+ (SELECT COUNT(*) FROM banners WHERE username = 'user')
+ (SELECT COUNT(*) FROM stream_updates WHERE username = 'user')
AS cnt from members WHERE username = 'user'
这将组合给定行的计数,并将所有计数的总和输出为列cnt。
我想把这两个语句组合起来,这样我就可以得到一个返回friend,cnt的结果。
示例输出将非常简单:
username | cnt
----------------------
a friend | 6525
diff friend | 983
yet again | 3485
我可以很容易地在两个php循环中运行它,首先从第一个查询中获得朋友的名字,然后使用foreach并在第一个查询的循环中运行第二个查询,我只是想知道是否有更好的方法,或者是一种将语句组合成一个语句的方法来获得上面的输出。
发布于 2016-09-28 02:16:01
我认为您只需要相关子查询:
SELECT username,
( (SELECT COUNT(*) FROM sites s WHERE s.username = f.username) +
(SELECT COUNT(*) FROM banners b WHERE b.username = f.username) +
(SELECT COUNT(*) FROM stream_updates su WHERE su.username = f.username)
) as cnt
FROM (SELECT friend2 as username
FROM list_friends
WHERE friend1 = 'user' AND friend2 <> 'user'
UNION
SELECT friend1 as username
FROM list_friends
WHERE friend2 = 'user' AND friend1 <> 'user'
) f;
注意:这里不需要members
表。您已经从其他表中获得了username
。
https://stackoverflow.com/questions/39736903
复制