2016-09-28 67 views
0

首先,我有以下SQL语句:结合多元复合的MySQL语句

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。

我想结合这两个语句,所以我可以得到一个返回朋友,cnt的结果。

示例输出将是非常简单的:

username | cnt 
---------------------- 
    a friend  | 6525 
    diff friend | 983 
    yet again | 3485 

我可以很容易地在两个PHP循环运行这一点,首先从第一个查询得到的朋友的名字,然后使用foreach和运行第二个查询在第一个查询的循环中,我只是想知道是否有更好的方法,或者是一种将语句组合成一个以获得上述输出的方式。

+0

你想从第一个查询或所有行的计数? –

+0

第一个查询返回“朋友”。然后我希望每个朋友都可以通过第二个查询来获取该朋友的“cnt”。 – Bruce

+0

为了让这个真的很清楚,我们为一个给定的用户获得了一个“朋友列表”,那么这个朋友列表中的每个用户都会计算他们执行的总“行动”。 – Bruce

回答

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

+0

你在第三行结尾缺少一个+,但这正是我期待的!谢谢。 – Bruce

+0

@布鲁斯。 。 。我很高兴这有助于。这是一个复杂的查询。干杯。 –