繁体   English   中英

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

[英]Can I merge two MySQL queries into one?

我有以下代码,它使用 2 个查询来获取朋友列表。

<?php

$getFriendStatement = <<<EOS
  SELECT DISTINCT u.username
    FROM users AS u 
      INNER JOIN test_friends AS f on u.Id = f.user_id 
    WHERE f.friend_id = ?
       && f.active=1
EOS;

$getFriendQuery = $mysqli->prepare($getFriendStatement);
$getFriendQuery->bind_param('i', $userID);
$getFriendQuery->execute() or die ($mysqli->error);
$getFriendResult = $getFriendQuery->get_result();

$friendName = "";

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


$getFriendStatement = <<<EOS
    SELECT u.username 
      FROM users AS u 
        INNER JOIN test_friends AS f ON u.id = f.user_id 
      WHERE (f.friend_id = ? AND active=1) 
         OR (f.user_id = ? AND active=1)
EOS;

$getFriendQuery = $mysqli->prepare($getFriendStatement);
$getFriendQuery->bind_param('ii', $userID, $userID);
$getFriendQuery->execute() or die ($mysqli->error);
$getFriendResult = $getFriendQuery->get_result();


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

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

?>

有没有办法只执行 1 个查询来检索所有朋友?

Schema 信息:以上依赖于两个表userstest_friends

CREATE TABLE users (
  `id` int(11),
  `username` varchar(256)
);

CREATE TABLE test_friends (
  `user_id` int(11),
  `friend_id` int(11),
  `active` tinyint,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
    ON UPDATE CASCADE ON DELETE CASCADE,
  FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`)
    ON UPDATE CASCADE ON DELETE CASCADE
);

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

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

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

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

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

将返回名称为 billy 或 bob 的所有用户。 将上面的整个两个查询与 UNION 结合起来应该可以工作。

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

我假设在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 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM