MySQL视图中的子查询与GROUP

时间:2014-06-03 18:02:40

标签: mysql view subquery

我正在尝试使用此代码构建视图:

SELECT * 
FROM `ergebnis`
LEFT JOIN (
    SELECT `NR` AS `MESSWERT_NR`, `ERGEBNISNUMMER`,`TESTSTEPREIHENFOLGE`, `MESSBEZEICHNUNG`, `STEP_BEZEICHNUNG`, `MESSWERT`, `MESSERGEBNIS`
    FROM (
        SELECT *
        FROM `messwerte`
        ORDER BY `NR` DESC
        ) AS `f_messwerte`
    GROUP BY `ERGEBNISNUMMER`,`TESTSTEPREIHENFOLGE`
    ORDER BY `ERGEBNISNUMMER`,`TESTSTEPREIHENFOLGE`
) AS `t_messwerte`
ON (`t_messwerte`.`ERGEBNISNUMMER` = `ergebnis`.`NR`)
ORDER BY `NR` DESC,`TESTSTEPREIHENFOLGE`;

正如您所看到的,它在很大程度上依赖于Messwerte中的ORDER指令,它将被分组。但是在VIEW中不允许使用子查询。

假设这是我的源表:

NR  ERGEBNISNUMMER  TESTSTEPREIHENFOLGE MESSWERT
1   1               1                   80
2   1               1                   86
3   1               2                   306
4   1               2                   302
5   1               2                   304
6   1               3                   0.2
7   2               1                   81
8   2               1                   79
9   2               1                   80
10  2               2                   305
11  2               2                   301
12  2               3                   0.1
13  2               3                   0.3

这就是我想要的:

NR  ERGEBNISNUMMER  TESTSTEPREIHENFOLGE MESSWERT
13  2               3                   0.3
11  2               2                   301
9   2               1                   80
6   1               3                   0.2
5   1               2                   304
2   1               1                   86

我尝试使用多个VIEW,但是ORDER总是丢失,而且我没有获得具有最高NR的条目。

有人可以给我一个如何解决这个问题的提示吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (NR  INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,ERGEBNISNUMMER  INT NOT NULL
 ,TESTSTEPREIHENFOLGE INT NOT NULL
 ,MESSWERT DECIMAL(5,2) NOT NULL
 );

 INSERT INTO my_table VALUES
 (1   ,1               ,1                   ,80),
 (2   ,1               ,1                   ,86),
 (3   ,1               ,2                   ,306),
 (4   ,1               ,2                   ,302),
 (5   ,1               ,2                   ,304),
 (6   ,1               ,3                   ,0.2),
 (7   ,2               ,1                   ,81),
 (8   ,2               ,1                   ,79),
 (9   ,2               ,1                   ,80),
 (10  ,2               ,2                   ,305),
 (11  ,2               ,2                   ,301),
 (12  ,2               ,3                   ,0.1),
 (13  ,2               ,3                   ,0.3);

 SELECT x.* 
   FROM my_table x 
   JOIN 
      ( SELECT ERGEBNISNUMMER
             , TESTSTEPREIHENFOLGE
             , MAX(NR) max_nr 
          FROM my_table 
         GROUP 
            BY ERGEBNISNUMMER
             , TESTSTEPREIHENFOLGE
      ) y 
     ON y.ERGEBNISNUMMER = x.ERGEBNISNUMMER 
    AND y.TESTSTEPREIHENFOLGE = x.TESTSTEPREIHENFOLGE
    AND y.max_nr = x.NR;

 +----+----------------+---------------------+----------+
 | NR | ERGEBNISNUMMER | TESTSTEPREIHENFOLGE | MESSWERT |
 +----+----------------+---------------------+----------+
 |  2 |              1 |                   1 |    86.00 |
 |  5 |              1 |                   2 |   304.00 |
 |  6 |              1 |                   3 |     0.20 |
 |  9 |              2 |                   1 |    80.00 |
 | 11 |              2 |                   2 |   301.00 |
 | 13 |              2 |                   3 |     0.30 |
 +----+----------------+---------------------+----------+

或更慢,但没有子查询...

 SELECT x.*
   FROM my_table x
   LEFT 
   JOIN my_table y
     ON y.ERGEBNISNUMMER = x.ERGEBNISNUMMER
    AND y.TESTSTEPREIHENFOLGE = x.TESTSTEPREIHENFOLGE
    AND y.NR > x.NR
  WHERE y.NR IS NULL;
  +----+----------------+---------------------+----------+
  | NR | ERGEBNISNUMMER | TESTSTEPREIHENFOLGE | MESSWERT |
  +----+----------------+---------------------+----------+
  |  2 |              1 |                   1 |    86.00 |
  |  5 |              1 |                   2 |   304.00 |
  |  6 |              1 |                   3 |     0.20 |
  |  9 |              2 |                   1 |    80.00 |
  | 11 |              2 |                   2 |   301.00 |
  | 13 |              2 |                   3 |     0.30 |
  +----+----------------+---------------------+----------+