【问题标题】:MySql Combinate queriesMySql 组合查询
【发布时间】:2014-04-02 18:39:46
【问题描述】:

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

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)

有人有什么想法吗?

对不起,西班牙语和糟糕的英语,希望你能理解。

【问题讨论】:

标签: mysql


【解决方案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这个另一个表。

根据具体情况,这两种方法都可以提供更好的性能。如果您尝试其中一种但性能不佳,请尝试另一种,看看是否有所改进。

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

【讨论】:

    【解决方案2】:

    就像 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
    

    【讨论】:

    • SELECT ... FROM reportefallas WHERE ... Defect IN (SELECT defect from reportefallas) 完全是多余的。选择缺陷列表的含义是该列表不包含表中Defect 的所有可能值。
    • 如果 OP 在他的表中有一个缺陷列表,而不是将它们全部写出来,似乎在选择时过滤掉它们会更简单。看不出它是多么多余,因为他已经把它们都写出来了
    • 只有当DefaultNULL 时,任何行都会被这样的条件过滤,在这种情况下WHERE Default IS NOT NULL 将是使用的明显条件而不是子查询。你的意思是,给我表中存在值的每一行(在同一个表中);并禁止NULL(这不是一个值)这是一个重言式。 (例如sqlfiddle.com/#!2/6cd03/1
    • 我知道它在做什么...从 OP 提供的列表中,它看起来像是表中的每个值。I want to consult only the three most repetitive defects of manufacture 他想计算所有缺陷并返回3个最重复的。这得到了所有的缺陷。我认为 OP 应该从他的数据库中运行它并让我知道它是否错误,因为我不知道为什么这不起作用
    • 我有一个缺陷列表,但并非所有缺陷都来自制造商,而且我只想要这些缺陷中的 Top3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2016-02-12
    相关资源
    最近更新 更多