具有两个变量的 SQL 不同
Posted
技术标签:
【中文标题】具有两个变量的 SQL 不同【英文标题】:SQL DISTINCT WITH TWO VARIABLES 【发布时间】:2022-01-16 06:28:43 【问题描述】:我正在使用 php 和 ajax 创建一个消息传递网站。
获取对话时出现问题。
问题在于,每当两个用户在他们之间聊天时,就会有两个不同的行带有 id;
例子
A和B在聊天,只写了4条消息
消息数据库是这样的
id senderid recieverid
1 a.id b.id
2 b.id a.id
3 b.id a.id
4 a.id b.id
我的目标是使用此代码获取记录
SELECT DISTINCT senderid, recieverid from messages WHERE (senderid = '".$pageowner."' OR recieverid='".$pageowner."')
$pageowner 是登录的用户;
用这种方法我得到两个相同的对话
ab 和 ba
代码在页面上给了我两个对话,我只想得到一个结果;
我的整个php代码是这样的
if(isset($_POST['id']))
include 'config.php';
$pageowner = $_POST['id'];
$sql = "SELECT DISTINCT senderid, recieverid from messages WHERE (senderid = '".$pageowner."' OR recieverid='".$pageowner."')";
$result = mysqli_query($connect, $sql);
$conversations = mysqli_fetch_all($result);
$output = "";
foreach($conversations as $conversation)
$senderonmessages = $conversation[0];
$recieveronmessages = $conversation[1];
if($pageowner == $senderonmessages)
$convname = $recieveronmessages;
else
$convname = $senderonmessages;
$sql = "SELECT id, name, surname, userimage FROM users WHERE id='".$convname."' ORDER BY id" ;
$resconv = mysqli_query($connect, $sql);
$user = mysqli_fetch_assoc($resconv);
$output .= '
<div class="conversationuser" id='.$user['id'].'>
<img src="'.$user['userimage'].'">
<span id="status"></span>
<div class="conv-info">
<h4><a href="">'.$user['name'].' '.$user['surname'].'</a></h4>
<p>Axirinici yazdigim mesaj <span id="time">10:34 AM</span></p>
</div>
<div class="conv-additional-info">
<span id="notif">1</span>
<i class="fas fa-ellipsis-v"></i>
</div>
</div>';
echo $output;
【问题讨论】:
你想得到什么?您对 SQL 注入持开放态度,使用参数化查询和准备好的语句。id, name, surname, userimage
也可以在第一次查询时使用 join
完成。
我想获得一行进行对话,数据库给了我从 a 到 b 和从 b 到 a 的两条记录,但我只想要一个
当您在 DB 中运行查询时,您会得到 8 行还是 4 行?问题可能是获取所有返回的数字和关联,因为没有定义返回方法
【参考方案1】:
您需要先解决您的 sql 注入问题。如果您不这样做,您的数据库中将没有任何数据需要担心,因为有人会丢弃它。
https://www.php.net/manual/en/security.database.sql-injection.php
此外,您的查询提供了您所要求的内容:DISTINCT senderid, recieverid
为了解决您的问题,我将创建一个类似于以下内容的视图:
create view conversations as
SELECT senderid, recieverid FROM messages GROUP BY 1, 2
UNION
SELECT receiverid, senderid FROM messages GROUP BY 1, 2
然后,你就可以从这个视图select
得到你想要的了。
正如评论中提到的那样,UNION
会给你与众不同,所以你甚至不需要那个......
【讨论】:
union(即不是联合all)已经实现了distinct以上是关于具有两个变量的 SQL 不同的主要内容,如果未能解决你的问题,请参考以下文章
在ggplot2中绘制两个具有相同y变量但不同x变量的箱线图
从具有两个变量列的表中选择最大值(microsoft SQL)