MySql组合查询

时间:2014-04-02 18:39:47

标签: mysql

我有一张表格,里面有公司不同缺陷的记录。表就是这样的

ITMNBR          Defect                       Reference_Designator   RepairCenter
8800RTO001700   Componente / Placa abierto          U1U2                FG
8800HIB001075V  Componente Equivocado (NumeroParte) R53                 SB
8800HIB001075V  Ensamble Incorrecto (produccion)    R19                 SB
8800RTO000400   Componente / Placa abierto          U1                  SB
8800RTO003200   Componente Polaridad Inversa        ZD2                 SB
8800HIB001048   NO SOLDADURA                        T1                  SB
8800HIB001048   Componente / Placa abierto          U2                  SB
8800HIB001048   Componente / Placa abierto          U2                  SB
Etc.

我只想咨询三个最重复的制造缺陷,我做了这个。

SELECT defect, COUNT(*) FROM reportefallas WHERE RepairCenter ='SB'
AND (CREADT BETWEEN NOW() - INTERVAL 7 DAY AND NOW()) #Select the Dates
AND (Defect IN ('Componente / Placa dañada X alto voltaje','Pin / Patita Quebrado','Componente / Placa Quemada','Componente Defecto Cosmetico','Falla no Duplicada','Soldadura Crackeada','Soldadura Fria','Parametros Incorrectos en la torre','Parametros Incorrectos en el dibujo','Componente dañado fisicamente','Conector mal colocado (inclinado)','Tornillo / Rondana Suelto','Pista Levantada (dañada)','Componente Ausente','Soldadura Derretida','Componente Equivocado (NumeroParte)','NO SOLDADURA','Componente/Placa no programada','Conector mal ensamblado','No se encontro problema','Tornillo / Rondana Flojo','Componente / Placa abierto','Pin Hole','Pin / Pata levantada (no Soldadura)','Componente Polaridad Inversa','Puente de Soldadura','Componente Desfasado Pad','Componente / Placa en corto','Splash de Soldadura','LEDs con VF diferente / equivocado','LEDs con VF alto','LEDs con VF bajo','Ensamble Incorrecto (produccion)','Componente posicion Equivocada (referencia)','Cable ensamblado posicion incorrecta'))
GROUP BY defect
ORDER BY COUNT(*) DES
LIMIT 3;

我有下一个结果

Defect                                   COUNT(*)
Componente/ Placa abierto                      5
Componente / Placa dañada X alto voltaje      4
Componente dañado fisicamente                 3

现在,我需要从缺陷所在的同一个表中查询,只有我已经获得的三个最重复的缺陷,这就是我想要的结果:

 ITMNBR         Defect                                          Reference_Designator
    8800ITH001700   Componente / Placa abierto                  F2-U1(SHORT)-U2(SHORT)
    8800ITH001700   Componente / Placa abierto                  F2-U1(SHORT)-U2(SHORT)
    8800ITH001700   Componente / Placa abierto  F2-R29-R22-R19-R32-R13-U1(SHORT)-U2(SHORT)
    8800ITH001700   Componente / Placa abierto  F2-R29-R22-R19-R32-R13-U1(SHORT)-U2(SHORT)
    8800ITH001700   Componente / Placa abierto                  F2
    8850HZL0015EX   Componente / Placa dañada X alto voltaje   C6-C7
    8800HIB001084   Componente / Placa dañada X alto voltaje   R7-C20-MOV1
    8850HIB004205   Componente / Placa dañada X alto voltaje   C21-C42
    8800HIB004220   Componente / Placa dañada X alto voltaje   R22 SWITH-R44 SWITH
    8850HIB004206   Componente dañado fisicamente              C42
    8850HIB004202   Componente dañado fisicamente              F1
    8800HIB0131EX   Componente dañado fisicamente              R37

我尝试了下面的代码,但它不接受LIMIT。

SELECT ITMNBR, Defect, Reference_Designator FROM reportefallas
WHERE Defect IN (SELECT defect FROM reportefallas WHERE RepairCenter='SB'
AND(CREADT BETWEEN NOW() - INTERVAL 7 DAY AND NOW()) AND (Defect IN ('Componente / Placa dañada X alto voltaje','Pin / Patita Quebrado','Componente / Placa Quemada','Componente Defecto Cosmetico','Falla no Duplicada','Soldadura Crackeada','Soldadura Fria','Parametros Incorrectos en la torre','Parametros Incorrectos en el dibujo','Componente dañado fisicamente','Conector mal colocado (inclinado)','Tornillo / Rondana Suelto','Pista Levantada (dañada)','Componente Ausente','Soldadura Derretida','Componente Equivocado (NumeroParte)','NO SOLDADURA','Componente/Placa no programada','Conector mal ensamblado','No se encontro problema','Tornillo / Rondana Flojo','Componente / Placa abierto','Pin Hole','Pin / Pata levantada (no Soldadura)','Componente Polaridad Inversa','Puente de Soldadura','Componente Desfasado Pad','Componente / Placa en corto','Splash de Soldadura','LEDs con VF diferente / equivocado','LEDs con VF alto','LEDs con VF bajo','Ensamble Incorrecto (produccion)','Componente posicion Equivocada (referencia)','Cable ensamblado posicion incorrecta'))
GROUP BY defect
ORDER BY COUNT(*) DESC
LIMIT 3)

有没有人有任何想法?

对不起英语和英语不好,我希望你能理解。

2 个答案:

答案 0 :(得分:1)

有几种选择。以前关于此主题的问题建议使用JOIN来减少结果集而不是IN,这看起来像这样:

SELECT rf.ITMNBR, rf.Defect, rf.Reference_Designator 
FROM (SELECT defect FROM reportefallas WHERE RepairCenter='SB'
    AND(CREADT BETWEEN NOW() - INTERVAL 7 DAY AND NOW()) AND (Defect IN ('Componente / Placa dañada X alto voltaje','Pin / Patita Quebrado','Componente / Placa Quemada','Componente Defecto Cosmetico','Falla no Duplicada','Soldadura Crackeada','Soldadura Fria','Parametros Incorrectos en la torre','Parametros Incorrectos en el dibujo','Componente dañado fisicamente','Conector mal colocado (inclinado)','Tornillo / Rondana Suelto','Pista Levantada (dañada)','Componente Ausente','Soldadura Derretida','Componente Equivocado (NumeroParte)','NO SOLDADURA','Componente/Placa no programada','Conector mal ensamblado','No se encontro problema','Tornillo / Rondana Flojo','Componente / Placa abierto','Pin Hole','Pin / Pata levantada (no Soldadura)','Componente Polaridad Inversa','Puente de Soldadura','Componente Desfasado Pad','Componente / Placa en corto','Splash de Soldadura','LEDs con VF diferente / equivocado','LEDs con VF alto','LEDs con VF bajo','Ensamble Incorrecto (produccion)','Componente posicion Equivocada (referencia)','Cable ensamblado posicion incorrecta'))
    GROUP BY defect
    ORDER BY COUNT(*) DESC #Ordena de manera descendente
    LIMIT 3) AS subquery
JOIN
    reportefallas AS rf USING (Defect)

或者,您可以创建一个单独的表来跟踪三个最常见的缺陷,并定期更新该表(例如,通过cron作业)。然后你会SELECT ... WHERE Defect IN这个另一张桌子。

根据具体情况,这些方法中的任何一种都可以提供更好的性能。如果你尝试一个并且表现不佳,那就试试另一个,看看它是否有所改善。

(就此而言,您还可以将大量缺陷列表存储在另一个表中,以使您的查询更清晰。)

答案 1 :(得分:-1)

就像AirThomas说你可以使用子查询一样..你也应该能够在你的IN()中做一个简单的选择,而不是单独列出每一个。这是执行子查询的另一种方法

SELECT rf.ITMNBR, rf.Defect, rf.Reference_Designator 
FROM(
    SELECT ITMNBR as itm_number, defect, COUNT(*) as top_three FROM reportefallas WHERE RepairCenter ='SB'
    AND (CREADT BETWEEN NOW() - INTERVAL 7 DAY AND NOW()) -- Select the Dates
    AND (Defect IN (SELECT defect from reportefallas))
    GROUP BY defect
    ORDER BY top_three DES
    LIMIT 3
)as t
JOIN reportefallas rf ON rf.ITMNBR = t.itm_number