我可以将两个MySQL查询合并为一个吗?

时间:2009-02-25 03:12:11

标签: php mysql

我有以下代码

<?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个查询并可以检索所有朋友列表?

更多信息:

我有两张桌子。 "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 个答案:

答案 0 :(得分:6)

您应该能够在一个联合中执行两个查询。您的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子句中使用带有联合的结果集列号。

仅当每个子查询在结果集中返回的列的数量和类型相同时,联合查询才有效。

旁白:您的第一个查询似乎是第二个查询的子集,因此您实际上只需要第二个查询。我已经把它留作了如何做工会的演示,但在这种情况下你并不需要。

答案 1 :(得分:3)

您可以在两个查询之间执行UNION。例如:

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

将返回名称为billy或bob的所有用户。将上述两个查询与UNION相结合应该可以正常工作。

答案 2 :(得分:0)

由于您的第一个查询似乎是第二个查询的子集,因此您只需要执行第二个查询。

我假设在 Test_Friends 表中, user_id 字段代表用户的用户ID, friend_id 字段代表用户的用户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 

答案 3 :(得分:0)

所以你想要$ 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