【问题标题】:Subquery in MySQL View with GROUP带有 GROUP 的 MySQL 视图中的子查询
【发布时间】:2014-06-03 18:02:39
【问题描述】:

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

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 最高的条目。

有人可以告诉我如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • 是的,这不好 - 这也是未记录的行为(除非您计算手册的 user-cmets 部分)。

标签: mysql view subquery


【解决方案1】:
 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 |
  +----+----------------+---------------------+----------+

【讨论】:

  • 谢谢!你让我开心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多