首页 > 解决方案 > 错误使用 GROUP BY

问题描述

我在查询时遇到了真正的问题。数据库实体是:

Paziente (Codice_Fiscale, Nome_Paziente, Cognome_Paziente, Data_Nascita, Luogo_Nascita)
Appuntamento (Codice_Appuntamento, Data_Appuntamento, Ora_Appuntamento, Codice_Fiscale)
Intervento (Codice_Intervento, Tipo_Intervento, Sala_Intervento, Data_Intervento, Ora_Intervento, Codice_Fiscale_Paziente, ID_Dentista)
Dentista (ID_Dentista, Nome_Dentista, Cognome_Dentista)

我需要做一个查询,显示按干预类型分组的约会列表。它应该是这样的:

Tipo_Intervento       COUNT(*)  
Chirurgia dentale      1
Cura carie             2
Estrazione dentale     1
Pulizia dentale        3

当我使用这个查询时,我可以正确地做到这一点:

SELECT intervento.Tipo_Intervento, COUNT(*)
FROM intervento
GROUP BY intervento.Tipo_Intervento 

但我需要将数据库“intervento”链接到“appuntamento”(因为这是一个练习),当我使用它时:

SELECT COUNT(DISTINCT appuntamento.Codice_Appuntamento) AS Numero_Appuntamenti, intervento.Tipo_Intervento AS Tipologia_intervento
FROM appuntamento, intervento
WHERE appuntamento.Codice_Fiscale = intervento.Codice_Fiscale_Paziente
GROUP BY intervento.Tipo_Intervento

我得到了错误的值:

Numero_Appuntamenti      Tipologia_intervento   
2                        Chirurgia dentale
4                        Cura carie
2                        Estrazione dentale
3                        Pulizia dentale

问题出在 GROUP BY intervento.Tipo_Intervento 中,它增加了约会的数量,事实上,如果我使用 GROUP BY appuntamento.Codice_Appuntamento 我得到:

Numero_Appuntamenti  Tipologia_intervento   
1                    Pulizia dentale
1                    Estrazione dentale
1                    Pulizia dentale
1                    Cura carie
1                    Cura carie
1                    Pulizia dentale
1                    Estrazione dentale

没错,但我需要将其分组。

有人可以帮助我吗?(请原谅我的英语不好,因为你可以看到这不是我的语言)

编辑:这是表“appuntamento”:

Codice_Appuntamento Data_Appuntamento   Ora_Appuntamento    Codice_Fiscale  
        001           2020-05-05    16:00:00.000000     RSSMRA80A01H501U
        002           2020-07-03    16:30:00.000000     VRDGPP85E02F205P
        003          2020-06-05     16:00:00.000000     RSSMRA80A01H501U
        004          2020-08-14     17:15:00.000000     BNCGNN83D03L219B
        005           2020-08-27    17:45:00.000000     BNCGNN83D03L219B
        006          2020-07-05     16:00:00.000000     RSSMRA80A01H501U
        007          2020-09-13     17:20:00.000000     VRDGPP85E02F205P

而这张表“干预”

Codice_Intervento Tipo_Intervento   Sala_Intervento    Data_Intervento   Ora_Intervento   Codice_Fiscale_Paziente   ID_Dentista     
    A_001          Pulizia dentale        1             2020-05-05       16:00:00.000000    RSSMRA80A01H501U            D_001
    A_002          Estrazione dentale     2             2020-07-03        16:30:00.000000   VRDGPP85E02F205P            D_003
    A_003          Pulizia dentale        1             2020-06-05        16:00:00.000000   RSSMRA80A01H501U            D_001
    A_004          Cura carie             3             2020-08-14        17:15:00.000000   BNCGNN83D03L219B            D_001
    A_005          Chirurgia dentale      5             2020-08-27        17:45:00.000000   BNCGNN83D03L219B            D_002
    A_006          Pulizia dentale        1             2020-07-05        16:00:00.000000   RSSMRA80A01H501U            D_001
    A_007          Cura carie             3             2020-09-13         17:20:00.000000  VRDGPP85E02F205P            D_002

"Codice accountinge" 和 "ID_Dentista" 是外键,它们是 "paziente" 和 "dentista" 的主键

标签: phpmysql

解决方案


您可以使用此查询:

SELECT max(i.Tipo_Intervento), count(a. Codice_Appuntamento)
FROM intervento as i left join appuntamento as a on i.Codice_Fiscale_Paziente = a.Codice_Fiscale 
GROUP BY i.Sala_Intervento

推荐阅读