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