我尝试了一些类似的SO问题,但我似乎无法弄明白。
在第一个内连接上,我只想引入DISTINCT function
列代码和serial_id。因此,当我选择SUM时,它会按每个不同的方式计算一个。即有多个行具有相同的func.code和func.serial_id。我只想要其中一个。
SELECT
sl.imp_id,
lat.version,
SUM(IF(lat.status = 'P',1,0)) AS powered,
SUM(IF(lat.status = 'F',1,0)) AS functional
FROM slots sl
INNER JOIN functions func ON sl.id = func.slot_id
INNER JOIN latest_status lat ON lat.code = func.code
AND lat.serial_id = func.serial_id
WHERE sl.id=55
GROUP BY sl.imp_id, lat.version
编辑2 - 样本数据说明-------------------
slots - id, imp_id, name
functions - id, slot_id, code, serial_id
latest_status - id, code, serial_id, version, status
**slots**
id imp_id name
1 5 'the name'
2 5 'another name'
3 5 'name!'
4 5 'name!!'
5 5 'name!!!'
6 5 'testing'
7 5 'hi'
8 5 'test'
**functions**
id slot_id code serial_id
1 1 11HRK 10
2 2 22RMJ 11
3 3 26OLL 01
4 4 22RMJ 00
6 6 11HRK 10
7 7 11HRK 10
8 8 22RMJ 00
**latest_status**
id code serial_id version status
1 11HRK 10 1 F
1 11HRK 10 2 P
3 22RMJ 11 1 P
4 22RMJ 11 2 F
5 26OLL 01 1 F
6 26OLL 01 2 P
7 22RMJ 00 1 F
8 22RMJ 00 2 F
运行查询后,结果应如下所示:
imp_id version powered functional
5 1 1 3
5 2 2 2
根据代码serial_id汇总函数表。每个代码1行,serial_id。 然后它基于serial_id和代码连接到latest_status表,这是一个(函数)到多个(latest_status)关系,因此有两行,每个版本一个。
答案 0 :(得分:1)
如何使用DISTINCT
?
SELECT
SUM(IF(lat.status = 'P',1,0)) AS powered,
SUM(IF(lat.status = 'F',1,0)) AS functional
FROM slots sl
INNER JOIN (Select DISTINCT id1, code, serial_id from functions) f On sl.rid = f.id1
INNER JOIN latest_status lat ON lat.code = f.code
AND lat.serial_id = f.serial_id
WHERE sl.id=55
GROUP BY sl.imp_id, lat.version
答案 1 :(得分:0)
如果只想要不同的代码和serial_id,则需要按那些不是imp_id和版本的那些进行分组。并最终得到像
这样的东西SELECT
SUM(IF(lat.status = 'P',1,0)) AS powered,
SUM(IF(lat.status = 'F',1,0)) AS functional
FROM slots sl
INNER JOIN functions func ON sl.rid = func.id1
INNER JOIN latest_status lat ON lat.code = func.code
AND lat.serial_id = func.serial_id
WHERE sl.id=55
GROUP BY func.code, func.serial_id
然而,这可能都是不可思议的,如果没有更多的数据,那么其他一些专栏也是如此,但它们似乎并不是你想要分组的。