首先我有以下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'
这将合并给定行的计数,并输出所有COUNT的总和作为列cnt。
我想结合这两个语句,这样我就可以得到一个返回friend,cnt。
的结果示例输出非常简单:
username | cnt
----------------------
a friend | 6525
diff friend | 983
yet again | 3485
我可以在两个php循环中轻松运行它,首先从第一个查询中获取朋友的名字,然后使用foreach并在第一个查询的循环中运行第二个查询,我只是想知道是否有一种更好的方法,或者将这些语句组合成一种方式以获得上述输出的方法。
答案 0 :(得分:1)
我认为你只想要相关的子查询:
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
。