简体   繁体   中英

Subquery in MySQL View with GROUP

I'm trying to build a view using this code:

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`;

As you can see, it relies heavily on the ORDER instruction in Messwerte on which it will be grouped by. But Subqueries are not allowed in VIEWs.

Assuming this is my source table:

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

This is what I want:

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

I tried using multiple VIEWs, but the ORDER was alway lost, and I didn't get the entry with the highest NR.

Could somebody give me a hint on how to solve this?

Thanks in advance!

 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 |
 +----+----------------+---------------------+----------+

or slower, but no subquery...

 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 |
  +----+----------------+---------------------+----------+

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM