Могу ли я объединить два MySQL-запроса в один? - PullRequest
4 голосов
/ 25 февраля 2009

У меня был следующий код

<?php

$getFriendQuery = "SELECT DISTINCT U.username FROM users as U INNER JOIN test_friends as F on U.Id = F.user_id WHERE F.friend_id = '{$userID}' && F.active=1";


$getFriendResult = mysql_query($getFriendQuery, $conn) or die (mysql_error());

$friendName = "";


while($getFriendFetch = mysql_fetch_assoc($getFriendResult)){
  $friendName .= $getFriendFetch['username'] . ", ";
}


$getFriendQuery  = "SELECT u.username FROM users u INNER JOIN test_friends f ON u.id = f.user_id WHERE (f.friend_id = '{$userID}' AND active=1) OR (f.user_id = '{$userID}' AND active=1)";

$getFriendResult = mysql_query($getFriendQuery, $conn) or die (mysql_error());


while($getFriendFetch = mysql_fetch_assoc($getFriendResult)){
  $friendName .= $getFriendFetch['username'] . ", ";
}


if (!empty($friendName)){
  echo "Your friends: " . $friendName ;
} else {
  echo "You do not have any friends yet";
  } 

?>

Мой код требует 2 запроса, чтобы получить "friends list". Есть ли способ выполнить 1 запрос и получить список всех друзей?

Дополнительная информация:

Я получил 2 стола. "Users table" и "test_friends" Таблица. Таблица пользователей имеет:

id представляет user id => data type int(11)

username => data type varchar(256)

Test_friends таблица содержит:

user_id представляет user id => data type int(11)

friend_id => data type int(11)

active => tinyint

Ответы [ 4 ]

6 голосов
/ 25 февраля 2009

Вы должны быть в состоянии объединить, чтобы выполнить оба запроса в одном. Ваш SQL будет выглядеть так:

SELECT U.username
FROM   users AS U
INNER JOIN test_friends AS F
ON     U.Id = F.user_id
WHERE  F.friend_id = '{$userID}'
AND    F.active = 1
UNION
SELECT u.username
FROM   users u
INNER JOIN test_friends f
ON     u.id = f.user_id
WHERE  ( f.friend_id = '{$userID}'
AND      active = 1 )
OR     ( f.user_id = '{$userID}'
AND      active = 1 )

Он также удалит дубликаты для вас автоматически, как если бы вы включили DISTINCT для всего лота. (Вы делаете «UNION ALL», если не хотите этого.)

Также, если вы хотите упорядочить результаты, добавьте "ORDER BY 1 ASC" в конце. Вы можете использовать только номера столбцов набора результатов в предложении ORDER BY с объединениями.

Запросы объединения работают только в том случае, если количество и типы столбцов, возвращаемых в наборе результатов каждого подзапроса, одинаковы.

В сторону: ваш первый запрос является подмножеством второго запроса, поэтому вам действительно нужен только второй запрос. Я оставил это как демонстрацию того, как делать союзы, но вам в этом нет необходимости.

3 голосов
/ 25 февраля 2009

Вы можете выполнить UNION между двумя запросами. Например:

SELECT username FROM users WHERE username like '%billy%'
UNION 
SELECT username FROM users WHERE username like '%bob%'

вернет всех пользователей с такими именами, как Билли или Боб. Объединение ваших двух запросов выше с UNION должно работать.

0 голосов
/ 25 февраля 2009

так что вы хотите имена друзей $ userID И имена пользователей, у которых $ userID в качестве друга? как насчет

select distinct U.username 
from users U 
inner join test_friends f 
on 
    (f.user_id = U.id AND f.friend_id={userID}) OR 
    (f.friend_id=U.id AND f.user_id={userID})
where active=1
0 голосов
/ 25 февраля 2009

Поскольку ваш первый запрос является подмножеством вашего второго запроса, вам нужно только выполнить второй запрос.

Я предполагаю, что в таблице Test_Friends поле user_id представляет идентификатор пользователя, а поле friend_id представляет идентификатор пользователя друга пользователя.

Если это так, то вы можете выполнить запрос:

SELECT DISTINCT U.username 
   FROM Test\_Friends F 
   INNER JOIN Users U ON F.friend\_id = U.user\_id 
WHERE 
   F.user\_id = '{$userID}' AND 
   F.active = 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...