英文:
2 queries in one, MySQL and JSON
问题
以下是翻译好的部分:
我正在寻求的是优化数据库的加载时间,对于每次迭代,我都在调用它们的连接操作,这会影响我的网页加载时间。
想法是连接这三个表格,只需同时调用一个或两个查询,就可以输出我想要的所有字段。
我尝试过这样做,但没有成功。
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', t.id,
'rut_empleador', t.rut_empleador,
'titulo', t.titulo,
'descripcion', t.descripcion,
'foto', t.foto,
'cantidad_personas', t.cantidad_personas,
'ubicacion', t.ubicacion,
'fecha_publicacion', t.fecha_publicacion,
'fecha_seleccion_postulante', t.fecha_seleccion_postulante,
'fecha_finalizacion', t.fecha_finalizacion,
'precio', t.precio,
'postulaciones', JSON_OBJECT(
'id', p.id,
'id_trabajo', p.id_trabajo,
'rut_trabajador', p.rut_trabajador,
'id_estado', p.id_estado,
'fecha_publicacion', p.fecha_publicacion,
'user', JSON_OBJECT(
'rut', u.rut,
'dv', u.dv,
'nombres', u.nombres,
'apellidos', u.apellidos,
'mail', u.mail,
'direccion', u.direccion,
'foto', u.foto,
'fecha_nacimiento', u.fecha_nacimiento,
'fecha_registro', u.fecha_registro,
'ultima_visita', u.ultima_visita
)
)
)
) as result FROM trabajos t join postulaciones p on p.id_trabajo = t.id INNER JOIN usuario u ON p.rut_trabajador = u.rut where p.id_trabajo = t.id GROUP BY t.id order by t.fecha_publicacion desc;
router.get('/work/:id', async (req, res) => {
try {
const workById = await work.getWorkById(req.params.id);
const workAppliers = await work.getWorkAppliers(req.params.id);
res.status(200).json({
ok: true,
content: {
work: workById[0],
appliers: workAppliers
}
});
} catch (err) {
console.error(`Error while getting the job: `, err.message);
next(err);
}
});
我希望所有这些工作都能显示出来。
英文:
What i am looking to do is to optimize the load times of the database, for each iteration i am calling their joins and that is affecting the load times of my web page.
The idea is to join these three tables, and that with only one or 2 queries called at the same time, all the fields I want can be output.
I tried to do this but it didn't work.
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', t.id,
'rut_empleador', t.rut_empleador,
'titulo', t.titulo,
'descripcion', t.descripcion,
'foto', t.foto,
'cantidad_personas', t.cantidad_personas,
'ubicacion', t.ubicacion,
'fecha_publicacion', t.fecha_publicacion,
'fecha_seleccion_postulante', t.fecha_seleccion_postulante,
'fecha_finalizacion', t.fecha_finalizacion,
'precio', t.precio,
'postulaciones', JSON_OBJECT(
'id', p.id,
'id_trabajo', p.id_trabajo,
'rut_trabajador', p.rut_trabajador,
'id_estado', p.id_estado,
'fecha_publicacion', p.fecha_publicacion,
'user', JSON_OBJECT(
'rut', u.rut,
'dv', u.dv,
'nombres', u.nombres,
'apellidos', u.apellidos,
'mail', u.mail,
'direccion', u.direccion,
'foto', u.foto,
'fecha_nacimiento', u.fecha_nacimiento,
'fecha_registro', u.fecha_registro,
'ultima_visita', u.ultima_visita
)
)
)
) as result FROM trabajos t join postulaciones p on p.id_trabajo = t.id INNER JOIN usuario u ON p.rut_trabajador = u.rut where p.id_trabajo = t.id GROUP BY t.id order by t.fecha_publicacion desc;
To make it more easier, here is some diagram
Here is the way I'm getting this out
router.get('/work/:id', async (req, res) => {
try {
const workById = await work.getWorkById(req.params.id);
const workAppliers = await work.getWorkAppliers(req.params.id);
res.status(200).json({
ok: true,
content: {
work: workById[0],
appliers: workAppliers
}
});
} catch (err) {
console.error(`Error while getting the job: `, err.message);
next(err);
}
});
Interesting row JSON Parse:
[
{
"id":7,
"foto":"1685235939299-Screenshot_1.png",
"precio":"24569",
"titulo":"Personas de baja estatura",
"ubicacion":null,
"descripcion":"Se está organizando una fiesta temática de fantasía y necesito incorporar enanos de diferentes maneras para gregar diversión y ambiente.\r\n- La idea es que puedan dar la bienvenida a los invitados, socializar de manera amigable y entretenida.\r\n- Se organizarán juegos y competencias inspirados en las habilidades atribuidas a los enanos en la ficción, he de especificar que se tomarán las medidas para que los juegos sean seguros y adecuados para el espacio de la fiesta.\r\n- Deberá ofrecer bocadillos y bebidas a los invitados como \"Pociones Mágicas\" en vasos de corados, \"Panecillos mineros\" como aperitivos y postres con nombres divertidos.",
"postulaciones":{
"id":42,
"user":{
"dv":2,
"rut":20247706,
"foto":"1685291171171-naxiti.png",
"mail":"nicolasdiazgarces18@gmail.com",
"nombres":"Nicolas Andres ",
"apellidos":"Diaz Garces",
"direccion":"blanco encalada 1575 ",
"ultima_visita":"2023-05-28",
"fecha_registro":"2023-05-28 01:01:17",
"fecha_nacimiento":"1999-07-20T04:00:00.000Z"
},
"id_estado":3,
"id_trabajo":7,
"rut_trabajador":20247706,
"fecha_publicacion":"2023-05-29 19:34:19.000000"
},
"rut_empleador":20247706,
"cantidad_personas":"5",
"fecha_publicacion":"2023-05-28 01:05:39.000000",
"fecha_finalizacion":"2023-07-07 04:00:00.000000",
"fecha_seleccion_postulante":"2023-06-21 04:00:00.000000"
},
{
"id":7,
"foto":"1685235939299-Screenshot_1.png",
"precio":"24569",
"titulo":"Personas de baja estatura",
"ubicacion":null,
"descripcion":"Se está organizando una fiesta temática de fantasía y necesito incorporar enanos de diferentes maneras para gregar diversión y ambiente.\r\n- La idea es que puedan dar la bienvenida a los invitados, socializar de manera amigable y entretenida.\r\n- Se organizarán juegos y competencias inspirados en las habilidades atribuidas a los enanos en la ficción, he de especificar que se tomarán las medidas para que los juegos sean seguros y adecuados para el espacio de la fiesta.\r\n- Deberá ofrecer bocadillos y bebidas a los invitados como \"Pociones Mágicas\" en vasos de corados, \"Panecillos mineros\" como aperitivos y postres con nombres divertidos.",
"postulaciones":{
"id":44,
"user":{
"dv":5,
"rut":20482869,
"foto":"1684551595444-Screenshot_2.png",
"mail":"pablojavierprietocepeda@gmail.com",
"nombres":"Pablo",
"apellidos":"Prieto",
"direccion":"Las Rosas 110, Quilpué",
"ultima_visita":"2023-05-16",
"fecha_registro":"2023-05-16 12:09:23",
"fecha_nacimiento":"2000-07-07T04:00:00.000Z"
},
"id_estado":3,
"id_trabajo":7,
"rut_trabajador":20482869,
"fecha_publicacion":"2023-06-05 02:40:41.000000"
},
"rut_empleador":20247706,
"cantidad_personas":"5",
"fecha_publicacion":"2023-05-28 01:05:39.000000",
"fecha_finalizacion":"2023-07-07 04:00:00.000000",
"fecha_seleccion_postulante":"2023-06-21 04:00:00.000000"
}
]
How I want it to be:
[{
"id":7,
"foto":"1685235939299-Screenshot_1.png",
"precio":"24569",
"titulo":"Personas de baja estatura",
"ubicacion":null,
"descripcion":"Se está organizando una fiesta temática de fantasía y necesito incorporar enanos de diferentes maneras para gregar diversión y ambiente.\r\n- La idea es que puedan dar la bienvenida a los invitados, socializar de manera amigable y entretenida.\r\n- Se organizarán juegos y competencias inspirados en las habilidades atribuidas a los enanos en la ficción, he de especificar que se tomarán las medidas para que los juegos sean seguros y adecuados para el espacio de la fiesta.\r\n- Deberá ofrecer bocadillos y bebidas a los invitados como \"Pociones Mágicas\" en vasos de corados, \"Panecillos mineros\" como aperitivos y postres con nombres divertidos.",
"postulaciones":[{
"id":42,
"user": {
"dv":2,
"rut":20247706,
"foto":"1685291171171-naxiti.png",
"mail":"nicolasdiazgarces18@gmail.com",
"nombres":"Nicolas Andres ",
"apellidos":"Diaz Garces",
"direccion":"blanco encalada 1575 ",
"ultima_visita":"2023-05-28",
"fecha_registro":"2023-05-28 01:01:17",
"fecha_nacimiento":"1999-07-20T04:00:00.000Z"
},
"id_estado":3,
"id_trabajo":7,
"rut_trabajador":20247706,
"fecha_publicacion":"2023-05-29 19:34:19.000000"
},{
"id":44,
"user":{
"dv":5,
"rut":20482869,
"foto":"1684551595444-Screenshot_2.png",
"mail":"pablojavierprietocepeda@gmail.com",
"nombres":"Pablo",
"apellidos":"Prieto",
"direccion":"Las Rosas 110, Quilpué",
"ultima_visita":"2023-05-16",
"fecha_registro":"2023-05-16 12:09:23",
"fecha_nacimiento":"2000-07-07T04:00:00.000Z"
},
"id_estado":3,
"id_trabajo":7,
"rut_trabajador":20482869,
"fecha_publicacion":"2023-06-05 02:40:41.000000"
}],
"rut_empleador":20247706,
"cantidad_personas":"5",
"fecha_publicacion":"2023-05-28 01:05:39.000000",
"fecha_finalizacion":"2023-07-07 04:00:00.000000",
"fecha_seleccion_postulante":"2023-06-21 04:00:00.000000"
},]
答案1
得分: 0
我找到了这个:
在路由中:
router.get('/works', async (req, res) => {
try {
const works = await work.getWorks()
res.json({ ok: true, content: works.map(item => item.result[0]) })
//res.json(await { ok: true, content: works });
} catch (err) {
console.error(`Error while getting all jobs: `, err.message);
res.json({ ok: false, message: err.message });
next(err);
}
});
请注意,这是您提供的代码的一部分,其中包含了一些数据库查询和路由处理。如果您需要更多帮助或有其他问题,请随时提出。
英文:
I found this:
SELECT JSON_OBJECT(
'id', t.id,
'foto', t.foto,
'precio', t.precio,
'titulo', t.titulo,
'ubicacion', t.ubicacion,
'descripcion', t.descripcion,
'postulaciones', (
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', p.id,
'user', JSON_OBJECT(
'dv', u.dv,
'rut', u.rut,
'foto', u.foto,
'mail', u.mail,
'nombres', u.nombres,
'apellidos', u.apellidos,
'direccion', u.direccion,
'ultima_visita', u.ultima_visita,
'fecha_registro', u.fecha_registro,
'fecha_nacimiento', u.fecha_nacimiento
),
'id_estado', p.id_estado,
'id_trabajo', p.id_trabajo,
'rut_trabajador', p.rut_trabajador,
'fecha_publicacion', p.fecha_publicacion
)
)
FROM postulaciones p
INNER JOIN usuario u ON p.rut_trabajador = u.rut
WHERE p.id_trabajo = <your_job_id> -- Replace with the desired job ID
),
'rut_empleador', t.rut_empleador,
'cantidad_personas', t.cantidad_personas,
'fecha_publicacion', t.fecha_publicacion,
'fecha_finalizacion', t.fecha_finalizacion,
'fecha_seleccion_postulante', t.fecha_seleccion_postulante,
'empleador', JSON_OBJECT(
'rut_empleador', ue.rut,
'nombre_empleador', ue.nombres,
'apellido_empleador', ue.apellidos,
'direccion_empleador', ue.direccion,
'foto_empleador', ue.foto
)
) AS result
FROM trabajos t
LEFT JOIN usuario ue ON t.rut_empleador = ue.rut
WHERE t.id = <your_job_id> -- Replace with the desired job ID
GROUP BY t.id;
In the routes:
router.get('/works', async (req, res) => {
try {
const works = await work.getWorks()
res.json({ ok: true, content: works.map(item => item.result[0]) })
//res.json(await { ok: true, content: works });
} catch (err) {
console.error(`Error while getting all jobs: `, err.message);
res.json({ ok: false, message: err.message });
next(err);
}
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论