sqlite左连接返回相同的值

时间:2019-08-04 05:57:26

标签: sql sqlite

在我的sqlite命令下面,我想获取barcoeds的计数,当它等于sessions.id

select sessions.id, sessions.session_name, sessions.session_type,sessions.date_time, count(barcodes.id) as barcode_count 
from sessions left join barcodes
on sessions.id = barcodes.session_id
group by barcodes.id
order by sessions.id desc

此命令有效,但是返回的数据具有相同的值,例如,如果数据为1,则返回的数据多于3,但实际上我只有一行

0 = {_List} size = 5
 0 = 11
 1 = "111"
 2 = 2
 3 = "1398/05/14 ساعت:  08:43"
 4 = 1
1 = {_List} size = 5
 0 = 11
 1 = "111"
 2 = 2
 3 = "1398/05/14 ساعت:  08:43"
 4 = 1
2 = {_List} size = 5
 0 = 11
 1 = "111"
 2 = 2
 3 = "1398/05/14 ساعت:  08:43"
 4 = 1

2 个答案:

答案 0 :(得分:1)

首先计算表id中每个session_id的{​​{1}},然后加入barcodes

sessions

我想select s.id, s.session_name, s.session_type, s.date_time, coalesce(b.barcode_count, 0) barcode_count from sessions s left join ( select session_id, count(id) barcode_count from barcodes group by session_id ) b on s.id = b.session_id order by s.id desc 在表id中是唯一的,因此不需要barcodes

答案 1 :(得分:1)

我想您希望每个会话一行。因此,您的查询正在按错误的列进行汇总:

select s.id, s.session_name, s.session_type,
       s.date_time, count(b.id) as barcode_count 
from sessions s left join
     barcodes b
     on s.id = b.session_id
group by s.id
---------^ sessions not barcode
order by s.id desc;

您可能会发现,使用相关子查询也很容易做到这一点:

select s.*,
       (select count(*) from barcodes b where b.session_id = s.id)
from sessions s;

在这些查询中使用表别名使它们更易于编写和阅读。