2个查询,一个是MySQL,一个是JSON。

huangapple go评论58阅读模式
英文:

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

2个查询,一个是MySQL,一个是JSON。

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);
    }
});

Results:
2个查询,一个是MySQL,一个是JSON。

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"
   },]

I want all this jobs displayed
2个查询,一个是MySQL,一个是JSON。
2个查询,一个是MySQL,一个是JSON。

答案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);
    }
});

huangapple
  • 本文由 发表于 2023年6月9日 03:28:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/76435128.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定