2016-09-28 79 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

@布魯斯。 。 。我很高興這有助於。這是一個複雜的查詢。乾杯。 –