Mysql sql查询格式不正确,需要清理

Mysql sql查询格式不正确,需要清理,mysql,Mysql,嘿,亚尔,我有一个糟糕的问题,想知道是否有人可以看看它,让我知道如何清理它的任何建议。它可以工作,但在有太多记录后运行缓慢。它只涉及两个表,但查询基本上从problem_nodes表中的行中获取值,并将它们转换为列以获得最终结果 SELECT * FROM (SELECT urgency, name, phone, location, department,

嘿,亚尔,我有一个糟糕的问题,想知道是否有人可以看看它,让我知道如何清理它的任何建议。它可以工作,但在有太多记录后运行缓慢。它只涉及两个表,但查询基本上从problem_nodes表中的行中获取值,并将它们转换为列以获得最终结果

SELECT *
FROM   (SELECT urgency,
               name,
               phone,
               location,
               department,
               cc,
               status,
               case_manager,
               ip,
               case_manager_ei d,
               id_problem,
               id_problem_type,
               eid_author,
               title,
               body,
               date_created,
               date_modified
        FROM   problems AS main
               INNER JOIN (SELECT id_problem as t_urgency_id_problem,
                                  node_value AS urgency
                           FROM   problem_nodes
                           WHERE  node_name = "urgency")t_urgency
                 ON t_urgency.t_urgency_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_name_id_problem,
                                  node_value AS name
                           FROM   problem_nodes
                           WHERE  node_name = "name")t_name
                 ON t_name.t_name_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_phone_id_problem,
                                  node_value AS phone
                           FROM   problem_nodes
                           WHERE  node_name = "phone")t_phone
                 ON t_phone.t_phone_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_location_id_problem,
                                  node_value AS location
                           FROM   problem_nodes
                           WHERE  node_name = "location")t_location
                 ON t_location.t_location_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_department_id_problem,
                                  node_value AS department
                           FROM   problem_nodes
                           WHERE  node_name = "department")t_department
                 ON t_department.t_department_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_cc_id_problem,
                                  node_value AS cc
                           FROM   problem_nodes
                           WHERE  node_name = "cc")t_cc
                 ON t_cc.t_cc_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_status_id_problem,
                                  node_value AS status
                           FROM   problem_nodes
                           WHERE  node_name = "status")t_status
                 ON t_status.t_status_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_case_manager_id_problem,
                                  node_value AS case_manager
                           FROM   problem_nodes
                           WHERE  node_name = "case_manager")t_case_manager
                 ON t_case_manager.t_case_manager_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_ip_id_problem,
                                  node_value AS ip
                           FROM   problem_nodes
                           WHERE  node_name = "ip")t_ip
                 ON t_ip.t_ip_id_problem = main.id_problem
               INNER JOIN (SELECT id_problem as t_case_manager_eid_id_problem,
                                  node_value AS case_manager_eid
                           FROM   problem_nodes
                           WHERE  node_name = "case_manager_eid")
                          t_case_manager_eid
                 ON t_case_manager_eid.t_case_manager_eid_id_problem =
       main.id_problem)t  
这种检索数据的模式对我来说有点陌生,因此如果有任何帮助,我将不胜感激。

您可以尝试使用这种PIVOT技术。我已经做了前两个案例。您应该了解如何在其余部分扩展它

   SELECT main.*,
          MAX(CASE WHEN node_name = 'urgency' THEN node_value END) AS urgency,
          MAX(CASE WHEN node_name = 'name' THEN node_value END) AS name
   FROM   problems AS main INNER JOIN 
      problem_nodes pn ON pn.id_problem = main.id_problem
   WHERE node_name IN ('urgency','name')
   GROUP BY main.id_problem
这基本上是

子选择是不必要的-可以通过以下形式进行清理:

SELECT t_urgency.node_value AS urgency,
       main.id_problem,
FROM problems AS main
INNER JOIN problem_nodes AS t_urgency
    ON t_urgency.id_problem = main.id_problem
    AND t_urgency.node_name = "urgency"

我要注意的是,内部联接的独占使用是一个潜在的问题,因为problem_nodes表中必须存在一个属性,结果集才能包含该行。

原始查询基本上是一种非常笨拙的查询方法。你不需要所有的连接。您只需要一系列相关的子查询。试试这个:

SELECT 
    (SELECT node_value FROM problem_nodes WHERE node_name = "urgency" AND id_problem = p.id_problem ) AS t_urgency,                              
    (SELECT node_value FROM problem_nodes WHERE node_name = "name" AND id_problem = p.id_problem ) AS t_name,
    (SELECT node_value FROM problem_nodes WHERE node_name = "phone" AND id_problem = p.id_problem ) AS t_phone,
    (SELECT node_value FROM problem_nodes WHERE node_name = "location" AND id_problem = p.id_problem ) AS t_location,
    (SELECT node_value FROM problem_nodes WHERE node_name = "department" AND id_problem = p.id_problem ) AS t_department,
    (SELECT node_value FROM problem_nodes WHERE node_name = "cc" AND id_problem = p.id_problem ) AS t_cc,
    (SELECT node_value FROM problem_nodes WHERE node_name = "status" AND id_problem = p.id_problem ) AS t_status,
    (SELECT node_value FROM problem_nodes WHERE node_name = "case_manager" AND id_problem = p.id_problem ) AS t_case_manager,
    (SELECT node_value FROM problem_nodes WHERE node_name = "ip" AND id_problem = p.id_problem ) AS t_ip,
    (SELECT node_value FROM problem_nodes WHERE node_name = "case_manager_eid" AND id_problem = p.id_problem ) AS t_case_manager_eid,
    id_problem,
    id_problem_type,
    eid_author,
    title,
    body,
    date_created,
    date_modified
FROM   
    problems AS p

我还应该提到,如果没有为problem\u nodes.node\u name列编制索引,您可能看不到性能的提高。

我认为您的问题不在于它的格式,而在于它的外观,而在于它的功能和工作方式。实现Pivot的奇怪方式……而且它还假设,对于一个问题,它将拥有所有的问题节点,我不知道情况总是这样。。。。但查询中的内部联接表明了相同的情况。。。。和al@NitinMidha-从语义上讲,它可能不是一个轴心,它看起来像是在把一个EAV模型变成一行。@Code Roux-谢谢,我明白你的意思了…太好了,谢谢!我认为这是最简洁的实现,查询现在运行得更快了。如果你不介意的话,还有一个问题。我现在正试图按紧迫性字段过滤结果:其中节点名称位于“紧迫性”、“名称”、“电话”、“位置”、“部门”、“抄送”、“状态”、“案例管理器”、“ip”、“案例管理器”和紧迫性=但紧迫性显然是未知列。我该如何解决这个问题呢?使用GROUP BY main.id_problem HAVING emergency=MySQL允许您引用的列别名。