我对创建自己的项目和SQL很陌生,但我对拥有一个"排名"列感到问题,该列将根据"时间"列生成特定数据行的排名.我正在制作一个全栈CRUD数据库,它从mysql数据库拉到快速前端,到目前为止,我似乎不知道如何执行"搜索"函数来返回其中的行名称=?使用ROW_$函数时从用户输入.我仍然认为,与每次想要查找搜索结果时运行ROW_$查询相比,拥有完全独立的列是理想的 Select ,但我不知道该如何做到这一点.

到目前为止我的搜索功能如下:

async searchByName(name) {
        try{
            const response = await new Promise((resolve, reject) => {
                const query = "SELECT *, ROW_NUMBER() OVER (ORDER BY time) rn FROM medley_relay; SELECT * FROM medley_relay WHERE name = ?;";

                connection.query(query, [name], (err, results) => {
                    if (err) reject(new Error(err.message));
                    resolve(results);
                })
            });
            console.log(response);
            return response;
        } catch (error) {
            console.log(error);
        }
    }

它是这样叫的:

    const {name} = request.params;
    const db = dbService.getDbServiceInstance();

    const result = db.searchByName(name);

    

    result
    .then(data => response.json({data : data}))
    .catch(err => console.log(err)); 
    console.log(result);
})

并发送到前端,并附上以下内容:


searchBtn.onclick = function() {
    const searchValue = document.querySelector('#search-input').value;

    fetch('http://localhost:5000/search/' + searchValue)
    .then(response => response.json())
    .then(data => loadHTMLTable(data['data']));
}

加载HTMLTable是

    const table = document.querySelector('table tbody');

    console.log(data);

    if (data.length === 0) {
        table.innerHTML = "<tr><td class='no-data'>No Data</td><td class = 'no-data'colspan='5'>No Data</td></tr>";
        return;
    }

    let tableHtml = "";

    data.forEach(function ({id, name, time, date, rn}) {
    
        tableHtml += "<tr>";
        tableHtml += `<td>${rn}</td>`;
        tableHtml += `<td>${name}</td>`;
        tableHtml += `<td>${time}</td>`;
        tableHtml += `<td>${new Date(date).toLocaleDateString()}</td>`;
        tableHtml += `<td><button class="delete-row-btn" data-id=${id}>Delete</td>`;
        tableHtml += `<td><button class="edit-row-btn" data-id=${id}>Edit</td>`;
        tableHtml += "</tr>";
        
    });

    table.innerHTML = tableHtml;

}

其中,我在我的Web应用程序上将搜索到的名称作为html元素输入.

我得到的只是所有元素的未定义表,当我try console.log时,我得到的响应:

  [
    RowDataPacket {
      id: 15,
      name: 'Corning',
      time: '01:40:15',
      date: 2024-04-10T04:00:00.000Z,
      rn: 1
    },
    RowDataPacket {
      id: 16,
      name: 'Binghamton',
      time: '01:52:42',
      date: 2024-04-02T04:00:00.000Z,
      rn: 2
    }
  ],
  [
    RowDataPacket {
      id: 16,
      name: 'Binghamton',
      time: '01:52:42',
      date: 2024-04-02T04:00:00.000Z
    }
  ]
]

如果这真的很容易,我再次道歉,因为这是我第一次使用SQL或PHPmyadmin,但能够有一个专用列来作为行的编号,当添加或删除条目时自动刷新将是很棒的.到目前为止,我发现的所有其他事情都依赖于ROW_$,它没有设置永久列,至少对我来说没有,这不会起作用,因为我的"排名"最终在我的表中未定义.

推荐答案

不,不可能自动持久行号列.

原因有几个:

  • 如果您在拥有10亿行的表中插入或删除一行,您真的想要更新10亿行的行号的费用吗?大多数用户都会说不.这会让简单的操作变成非常昂贵的操作.

    此外,如果您使用基于ROW的格式的二进制日志(log),它会将更新的每一行复制到日志(log)中.

  • SQL支持并发事务,因此每个会话的行号可能不同.如果我要插入一些行,但尚未提交新行,则表是否应该重新编号行?也许在我的会话中,但在您的会话中不会,您处于查看表旧状态的事务中.您甚至可能在会话中插入或删除了不同的行,但我的会话看不到这些行.

  • 任何查询都可以包括JOINUNION,或者根据WHERE分句中的条件从给定结果中排除行,或者根据GROUP BY个表达将多行聚合为更少的行.所有这些都可以更改给定查询结果的行号.

Mysql相关问答推荐

MariaDB字段+1

对多个数据库运行UPDATE mySQL查询

如何跨多个产品查找相同时间范围的数据集

默认情况下,MariaDB是否限制为本地主机?

SQL Select 最大值和平均值

SQL:如何 Select 每个客户最后购买的产品?

完全匹配 IN 子句中的所有值

Mysql,显示谁已经和没有 Select 退出巴士服务

按年份范围 SQL 查询分组

根据使用 mysql 的第一个过滤结果添加更多表行

MySQL过滤食谱上的多对多 - 成分表

我将如何构建一个 SQL 查询来从交易表中 Select 第一次存款、第二次存款和额外存款

SQL UPDATE中的str_replace?

如何使用 laravel 连接 mysql?

如何在sequelize中定义多列的唯一索引

在 MySQL Workbench EER 图中的多个列上创建唯一约束

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

你能推荐一个免费的 Linux 轻量级 MySQL GUI 吗?

获得上个月的第一天和最后一天的最佳方式?

将数据库从 Postgres 迁移到 MySQL