2012-05-30 9 views
0

我使用這兩個語句查詢BuddyPress的對友誼,但我想知道,如果他們是更好的方法或途徑這兩個MySQL的語句組合:如何結合這兩種MySQL的報表

//Statement for friendship initiator 
    $SQL1 = "SELECT wp_users.display_name AS'name', 
        wp_users.user_login AS 'fname', 
        wp_users.user_nicename AS 'surname' 
      FROM wp_users 
      INNER JOIN wp_bp_friends 
        ON wp_users.id = wp_bp_friends.friend_user_id 
      WHERE 1=1 
       AND wp_bp_friends.initiator_user_id = " . $user_id . " 
       AND wp_bp_friends.is_confirmed = 1"; 


    //Statement for friendship non-initiator 
    $SQL2 = "SELECT wp_users.display_name AS 'name', 
        wp_users.user_login AS 'fname', 
        wp_users.user_nicename AS 'surname' 
      FROM wp_users 
      INNER JOIN wp_bp_friends 
        ON wp_users.id = wp_bp_friends.initiator_user_id 
      WHERE 1=1 
        AND wp_bp_friends.friend_user_id = " . $user_id . " 
        AND wp_bp_friends.is_confirmed = 1"; 

的結果應該包含基於$ user_id的友誼列表,無論他們是否啓動了關係。

回答

2
$sql = " 
    SELECT u.display_name AS name, 
     u.user_login AS fname, 
     u.user_nicename AS surname 
    FROM wp_users  AS u 
    JOIN wp_bp_friends AS f 
     ON (u.id, $user_id) IN (
      (f.friend_user_id, f.initiator_user_id), 
      (f.initiator_user_id, f.friend_user_id) 
     ) 
    WHERE f.is_confirmed = 1 
"; 

編輯

每低於@Quassnoi's comment,優雅如上面的回答是,它不會使用的查找索引(由於MySQL的執行漏洞)。相反,你可以這樣做:

$sql = " 
    SELECT u.display_name AS name, 
     u.user_login AS fname, 
     u.user_nicename AS surname 
    FROM wp_users  AS u 
    JOIN wp_bp_friends AS f 
     ON (f.friend_user_id = u.id AND f.initiator_user_id = $user_id) 
     OR (f.initiator_user_id = u.id AND f.friend_user_id = $user_id) 
    WHERE f.is_confirmed = 1 
"; 
+0

指數如何不友善! – Quassnoi

+0

@Quassnoi:哦,是的,我們回到了昨天的觀點:我已經忘記了。啊。可以將'IN'分解爲明確的'... OR ...'子句,以便更友好。我會更新我的答案。 – eggyal

+0

謝謝!這就像一個魅力,並提高了我的教育點! – Auzzy

0

如果你不關心哪個結果來自哪個查詢,那麼你可以很容易地用UNION將它們結合起來,就像這樣:

$sql = "SELECT 
    wp_users.display_name AS 'name', 
    wp_users.user_login AS 'fname', 
    wp_users.user_nicename AS 'surname' 
FROM wp_users 
INNER JOIN wp_bp_friends ON wp_users.id = wp_bp_friends.friend_user_id 
WHERE 1=1 
AND wp_bp_friends.initiator_user_id = " . $user_id . " 
AND wp_bp_friends.is_confirmed = 1 
UNION 
SELECT 
    wp_users.display_name AS 'name', 
    wp_users.user_login AS 'fname', 
    wp_users.user_nicename AS 'surname' 
FROM wp_users 
INNER JOIN wp_bp_friends ON wp_users.id = wp_bp_friends.initiator_user_id 
WHERE 1=1 
AND wp_bp_friends.friend_user_id = " . $user_id . " 
AND wp_bp_friends.is_confirmed = 1"; 

如果這非常重要,他們來到該查詢從,那麼你就可以添加靜態VARCHAR列到每個查詢,您可以使用以後要弄清楚哪個查詢該行的來源:

$sql = "SELECT 'FIRST', 
    wp_users.display_name AS 'name', 
    wp_users.user_login AS 'fname', 
    wp_users.user_nicename AS 'surname' 
FROM wp_users 
INNER JOIN wp_bp_friends ON wp_users.id = wp_bp_friends.friend_user_id 
WHERE 1=1 
AND wp_bp_friends.initiator_user_id = " . $user_id . " 
AND wp_bp_friends.is_confirmed = 1 
UNION 
SELECT 'SECOND', 
    wp_users.display_name AS 'name', 
    wp_users.user_login AS 'fname', 
    wp_users.user_nicename AS 'surname' 
FROM wp_users 
INNER JOIN wp_bp_friends ON wp_users.id = wp_bp_friends.initiator_user_id 
WHERE 1=1 
AND wp_bp_friends.friend_user_id = " . $user_id . " 
AND wp_bp_friends.is_confirmed = 1"; 
0
SELECT u.display_name, u.user_login, u.user_nicename 
FROM wp_bp_friends f 
JOIN wp_users u 
ON  u.id = 
     CASE @userId 
     WHEN f.initiator_user_id THEN 
       f.friend_user_id 
     WHEN f.friend_user_id THEN 
       f.initiator_user_id 
     END 
WHERE   (
        f.initiator_user_id = @userId 
        OR 
        f.friend_user_id = @userId 
       ) 
     AND f.is_confirmed = 1 

initiator_user_idfriend_user_id創建索引。

這將使用哪個index_merge(與InnoDB)比兩者的UNION結果集,由於更多的順序訪問wp_bp_friends稍微更有效。