Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以将两个MySQL查询合并为一个吗?_Php_Mysql - Fatal编程技术网

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

Php 我可以将两个MySQL查询合并为一个吗?,php,mysql,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 (m

我有以下代码

<?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";
  } 

?>
Test\u friends
表包含:

user\u id
表示
user id=>数据类型int(11)


您应该能够在一个联合中执行两个查询。您的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一样。(如果您不想这样做,您可以选择“联合所有人”。)

此外,如果要对结果排序,请在末尾添加“按1 ASC排序”。只能在ORDER BY子句中使用带有联合的结果集列号

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


旁白:您的第一个查询似乎是第二个查询的子集,因此您实际上只需要执行第二个查询。我把它作为如何进行联合的演示,但在这种情况下,您实际上不需要这样做。

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

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

将返回所有名为billy或bob的用户。将上面的两个查询与一个联合组合起来应该会起作用。

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

我假设在Test\u Friends表中,user\u id字段表示用户的userid,friend\u id字段表示用户朋友的userid

如果是这种情况,则可以执行查询:

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 

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

所以你有这个密码。。你的问题是什么?这些查询中的一些换行符如何?看起来这个答案好像有错误。以上两个查询都是相同的,因此这些查询的并集将产生与仅执行一个查询实例相同的记录集。如果上面提供了正确的结果,您可以通过只执行一个SELECT查询来简化查询。Hmmm,必须从原始答案中剪切并粘贴错误。我现在已经修好了。谢谢
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 
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