内部联接在一组不同的参数上

时间:2011-06-15 23:17:53

标签: mysql sql

我尝试了一些类似的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)关系,因此有两行,每个版本一个。

2 个答案:

答案 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

然而,这可能都是不可思议的,如果没有更多的数据,那么其他一些专栏也是如此,但它们似乎并不是你想要分组的。