组合多个复合mysql语句

时间:2016-09-28 02:04:02

标签: mysql

首先我有以下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并在第一个查询的循环中运行第二个查询,我只是想知道是否有一种更好的方法,或者将这些语句组合成一种方式以获得上述输出的方法。

1 个答案:

答案 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