2012-05-30 3 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 
"; 

EDIT

Per @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_id и friend_user_id.

Это будет использовать index_merge, который (с InnoDB) является немного более эффективным, чем UNION из двух ResultSets, за счет более последовательного доступа к wp_bp_friends.

 Смежные вопросы

  • Нет связанных вопросов^_^