使用左连接查询时导致错误的结果

时间:2018-03-27 12:30:07

标签: sql database sqlite left-join

对于我的项目,我有一个SQLite DB,如下所示:

https://sqliteonline.com/#fiddle-5aba37c986797mugjf9muddm

我正在尝试通过查询获取有关此内容的信息:

select 
     a.id_interno, 
     a.id_esterno, 
     count(b.id_ingrediente), 
     count(c.id_utente) 
from 
     lista_spesa a 
          left join elemento_lista_spesa b on b.id_lista_spesa = a.id_interno 
          left join utente_lista_spesa c on c.id_lista_spesa = a.id_interno 
group by 
    b.id_lista_spesa, c.id_lista_spesa;

但我获得了计数

ID_INTERNO|ID_ESTERNO|count(b.id_ingrediente)|count(c.id_utente)
1|-1|2|2

但我希望得到以下结果:

ID_INTERNO|ID_ESTERNO|count(b.id_ingrediente)|count(c.id_utente)
1|-1|1|2

为什么我有这个错误的结果?我该如何解决?

谢谢!

3 个答案:

答案 0 :(得分:0)

因为您要将表连接在一起,所以您有重复的值。尝试在计数函数中添加一个独特的:

select a.id_interno,
       a.id_esterno,
       count(DISTINCT b.id_ingrediente),
       count(DISTINCT c.id_utente) 
  from lista_spesa a
  left join elemento_lista_spesa b
    on b.id_lista_spesa = a.id_interno
  left join utente_lista_spesa c
    on c.id_lista_spesa = a.id_interno
 group by b.id_lista_spesa, c.id_lista_spesa;

答案 1 :(得分:0)

也许你想要这样的东西:

select a.id_interno, a.id_esterno, (select count(id_ingrediente) from elemento_lista_spesa) as cuentab, (select count(id_utente) from utente_lista_spesa) as cuentac
from lista_spesa a left join elemento_lista_spesa b on b.id_lista_spesa = a.id_interno 
left join utente_lista_spesa c on c.id_lista_spesa = a.id_interno
group by b.id_lista_spesa, c.id_lista_spesa;

结果是:

1, -1, 1, 2

答案 2 :(得分:0)

在您的情况下,您不需要为此查询使用Group by。只需在DISTINCT函数

中使用count()即可

选项1

 SELECT 
    lista_spesa.id_interno, 
    lista_spesa.id_esterno,
    count(DISTINCT elemento_lista_spesa.id_ingrediente), 
    count(DISTINCT utente_lista_spesa.id_utente) 
FROM
    lista_spesa
        left join elemento_lista_spesa on elemento_lista_spesa.id_lista_spesa  = lista_spesa.id_interno
        left join utente_lista_spesa on utente_lista_spesa.id_lista_spesa = lista_spesa.id_interno

选项2

SELECT 
    lista_spesa.id_interno, 
    lista_spesa.id_esterno,
    (SELECT count(elemento_lista_spesa.id_ingrediente) FROM elemento_lista_spesa WHERE elemento_lista_spesa.id_lista_spesa  = lista_spesa.id_interno) AS COUNT1, 
    (SELECT count(utente_lista_spesa.id_utente) FROM utente_lista_spesa WHERE utente_lista_spesa.id_lista_spesa = lista_spesa.id_interno) AS COUNT2
FROM
    lista_spesa