具有两个变量的 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)

如果它们都具有相同的 id,如何将来自 sql 查询的图像存储在不同的变量下?

从基类指针访问两个具有不同类型的派生成员变量。

不同对象中具有相同名称的两个变量改变彼此的值

如何网格化面板图,使其在 R 中的 ggplot 中具有分类变量和不同的 x 变量