如何在不丢失数据的情况下优化 SQL 查询?

How to optimize SQL query without losing data?

我正在使用 MySQL 查询数据库 tables.

我终于发现下面的查询 returns 我想从我的数据库中得到什么。 (我不是SQL专家)

SELECT * FROM ( SELECT swtickets.ticketid, swtickets.ticketstatustitle, swtickets.departmenttitle, swtickets.subject, swtickets.dateline, swtickets.ownerstaffname, swtickets.lastreplier, swcustomfieldvalues.fieldvalue, swcustomfieldvalues.customfieldid FROM swtickets, swcustomfieldvalues WHERE swcustomfieldvalues.typeid=swtickets.ticketid AND swtickets.ticketid IN (SELECT typeid FROM `swcustomfieldvalues` WHERE `fieldvalue`=12345678)) as tbl
where tbl.customfieldid=123

但是,上述查询需要很长时间才能在 phpMyAdmin 中显示结果。

Showing rows 0 - 24 (32 total, Query took 7.1488 sec)

能否将此查询优化为快于 7 秒?

这是我的 SQL小提琴:

http://sqlfiddle.com/#!9/d3b5a2

更多解释:

Table: swcustomfieldvalues

customfieldvalueid
customfieldid
typeid <— This field is not unique in this table
fieldvalue
isserialized
isencrypted
dateline
uniquehash
lastupdated

对于每张票,我在 swcustomfieldvalues 中有 9 个自定义字段 每张工单的所有 9 个自定义字段都具有相同的 typeid(= ticketid in swtickes table)。

如果customfieldid = 6,则fieldvalue保存用户全名

如果customfieldid = 7,则fieldvalue持有用户手机号码

如果我查询此 table 以获得 typeid=98765

我将得到 9 行都具有相同的 typeid 和 fieldvaluecustomfieldid 等不同的值...

我想从这个结果(9 行)中得到 fieldvalue 值,其中 customfieldid=6 但前提是 fieldvalue=1234567 其中 customfieldid=7

我的查询中已经有了这个值 1234567,所以我不关心它是否列在结果中。

更多解释:

所有当前答案都成功地为每张具有查询中提供的手机号码的票以及其他从“swtickets”出轨的票提取了这些行集table。

到目前为止我们在做什么: 搜索(查询)是在 customfieldid=7 和 fieldvalue = 0555.

条件下执行的

一切都很好。但我不希望字段值出现在结果中(我不关心它)我希望名称出现在我的行​​结果中。

只有在

的情况下,我才需要 customfieldid=6 行的 fieldvalue

customfieldid=7 的行有 fieldvalue=0555

两个查询的结果(我的和关于答案的):

你可以使用类似这样的东西来简化它,

SELECT 
swtickets.ticketid, 
swtickets.ticketstatustitle, 
swtickets.departmenttitle, 
swtickets.subject, 
swtickets.dateline, 
swtickets.ownerstaffname, 
swtickets.lastreplier, 
swcustomfieldvalues.fieldvalue,
swcustomfieldvalues.customfieldid 
FROM swtickets
LEFT JOIN swcustomfieldvalues 
ON 
swcustomfieldvalues.typeid = swtickets.ticketid 
AND
swcustomfieldvalues.fieldvalue = 12345678 
AND
swcustomfieldvalues.customfieldid = 123

试试这个

select swtickets.ticketid, swtickets.ticketstatustitle, swtickets.departmenttitle, swtickets.subject, swtickets.dateline, swtickets.ownerstaffname, swtickets.lastreplier, swcustomfieldvalues.fieldvalue, swcustomfieldvalues.customfieldid
      from swtickets
      join swcustomfieldvalues ON (swtickets.ticketid = swcustomfieldvalues.typeid)
      where swcustomfieldvalues.fieldvalue = 12345678 and swcustomfieldvalues.customfieldid=123