我对创建自己的项目和 SQL 非常陌生,并且我在使用“排名”列时遇到问题,该列将根据“时间”列生成特定数据行的排名。我正在制作一个全栈 CRUD 数据库,它从 mysql 数据库提取到快速前端,到目前为止,我似乎无法弄清楚如何执行返回 name = ? 的行的“搜索”函数。使用 ROW_NUMBER 函数时来自用户输入。我仍然认为,与每次想要查找搜索结果时运行 ROW_NUMBER 查询相比,拥有一个完全独立的列是理想的选择,但我不知道如何做到这一点。
到目前为止我的搜索功能如下:
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']));
}
loadHTMLTable 是
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;
}
我的网络应用程序上有一个用户输入的搜索名称作为 html 元素。
我得到的回报只是一个所有元素的未定义表,当我尝试 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_NUMBER,它没有设置永久列,至少对我来说不是,这不起作用,因为我的“排名”最终没有为我的表定义。
不,不可能有自动持久行号列。
原因是MySQL支持并发事务,因此每个会话的行号可能不同。如果我要插入一些行,但尚未提交新行,表是否应该对行重新编号?也许在我的会话中,但不是在您的会话中,您所在的事务正在查看表的旧状态。您甚至可能在会话中插入或删除了不同的行,而我的会话看不到这些行。
除此之外,任何查询都可以包含
JOIN
或 UNION
,或者根据 WHERE
子句中的条件从给定结果中排除行,或者根据 GROUP BY
表达式将多行聚合为更少的行。所有这些都可以更改给定查询结果的行号。