我正在运行一个快速服务器并连接到MySQL数据库。我有两个表,它们是通过user_id引用的。当用户提供电子邮件地址时,我需要查询users以找到user_id,然后运行另一个查询来加入tracking表。实现这一目标的最佳途径是什么?同时,对于代码的任何部分,任何最佳实践建议都是非常感谢的!
谢谢
MySQL
CREATE TABLE users (
user_id INT NOT NULL AUTO_INCREMENT UNIQUE,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) DEFAULT NULL,
email VARCHAR(320) NOT NULL UNIQUE,
date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (user_id)
);
CREATE TABLE tracking (
tracking_id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
metric VARCHAR(100) NOT NULL,
unit VARCHAR(100) NOT NULL,
amount DOUBLE DEFAULT NULL,
date_tracked DATE,
date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (tracking_id),
INDEX user_ind (user_id),
FOREIGN KEY (user_id)
REFERENCES users(user_id)
ON DELETE CASCADE
);特快(Nodejs)
const express = require("express");
const app = express();
const port = 3000;
var mysql = require("mysql");
var connection = mysql.createConnection({
host: "",
user: "",
password: "",
database: "tracker"
});
app.get("/data/:email/metric/:metric", (req, res) => {
console.log(req.params);
let user_id = "";
connection.connect();
connection.query(
`SELECT user_id FROM users WHERE email = '${req.params.email}';`,
function(error, results, fields) {
if (error) throw error;
user_id = results[0].user_id;
}
);
connection.query(
`SELECT users.first_name, users.last_name, users.email, tracking.metric, tracking.unit, tracking.amount, tracking.date_tracked FROM users JOIN tracking ON users.user_id = tracking.user_id WHERE users.user_id = '${user_id}' AND metric = '${
req.params.metric
}';`,
function(error, results, fields) {
if (error) throw error;
res.send(results);
}
);
connection.end();
});
app.listen(port, () => console.log(`Example app listening on port ${port}!`));发布于 2018-11-22 16:41:31
您可以通过一个查询来完成这一任务,只需在JOIN上user_id上的表
SELECT
u.first_name,
u.last_name,
u.email,
t.metric,
t.unit,
t.amount,
t.date_tracked
FROM users u
INNER JOIN tracking AS t ON t.user_id = u.user_id
WHERE u.email = '<email>' AND t.metric = '<metric>'另外,FWIW您应该使用参数化查询来保护自己不受SQL注入的影响。
const values = [
req.params.email,
req.params.metric
];
connection.query(
'SELECT ... WHERE u.email = ? AND t.metric = ?',
values,
(err, results, fields) => {
if (err) return next(e); // propagate the error to Express, rather than throwing in the callback
res.send(results);
}
);发布于 2018-11-22 16:53:06
我需要查询用户以找到user_id,然后运行另一个查询来加入跟踪表。实现这一目标的最佳途径是什么?
您只需使用一个查询即可实现:
SELECT users.first_name, users.last_name, users.email,
tracking.metric, tracking.unit, tracking.amount,
tracking.date_tracked
FROM users
JOIN tracking
ON users.user_id = tracking.user_id
WHERE users.email = '${req.params.email}' AND
metric = '${req.params.metric}同时,对于代码的任何部分,任何最佳实践建议都是非常感谢的!
首先,您应该在服务器启动后连接到mySql。
在每个请求上连接和断开连接将影响性能(打开套接字和外部连接的代价高昂)
所以,试一试如下:
CONNECTION.connect().then(() => {
// mysql is ready , let's start express server
// accepting connections
app.listen(port, () => console.log(`ready on ${port}!`));
}).catch(console.error)您应该知道的另一个好做法是并行运行查询和Promise.all([])。当您需要运行多个不相关的查询时,您可以一个接一个地执行这些查询,从而使所有结果的总等待时间更短。
https://stackoverflow.com/questions/53435087
复制相似问题