SQL 有两个变量的不同
SQL DISTINCT WITH TWO VARIABLES
我正在创建一个消息传递站点,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 是登录的用户;
用这个方法我得到了两个相同的对话
a<->b 和 b<->a
代码在页面上给了我两个对话,我只想得到一个结果;
我的整个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 注入问题。如果您不这样做,您的数据库中就没有任何数据需要担心,因为有人会丢弃它。
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
会给你独特的,所以你甚至不需要那个...
我正在创建一个消息传递站点,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 是登录的用户;
用这个方法我得到了两个相同的对话
a<->b 和 b<->a
代码在页面上给了我两个对话,我只想得到一个结果;
我的整个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 注入问题。如果您不这样做,您的数据库中就没有任何数据需要担心,因为有人会丢弃它。
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
会给你独特的,所以你甚至不需要那个...