sql >> Databáze >  >> RDS >> Mysql

MySQL 5.7.5+ získá první řádek pro skupiny

Vaše ORDER BY v odvozené tabulce je poddotaz v MySQL 5.7 ignorován.

Viz https://dev.mysql.com/ doc/refman/5.7/en/derived-table-optimization.html

Váš vnější dotaz má JOIN a GROUP BY, takže nesplňuje podmínky pro šíření ORDER BY, proto ignoruje ORDER BY.

Toto chování optimalizátoru je řízeno přepínačem optimalizátoru derived_merge . Můžete to zakázat.

Demo:

mysql [localhost] {msandbox} (test) > select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.21    |
+-----------+

mysql [localhost] {msandbox} (test) > SELECT     columnPrimaryKey,     column1,     column2,     column3 FROM     (SELECT         columnPrimaryKey,         column1,         column2,         column3     FROM testTable     ORDER BY column2 ) AS tbl GROUP BY column3;
+------------------+----------------+---------+---------+
| columnPrimaryKey | column1        | column2 | column3 |
+------------------+----------------+---------+---------+
|                1 | Some Name 8-4  |       4 |       8 |
|                6 | Some Name 9-1  |       1 |       9 |
|                8 | Some Name 10-2 |       2 |      10 |
+------------------+----------------+---------+---------+

mysql [localhost] {msandbox} (test) > set optimizer_switch = 'derived_merge=off';
Query OK, 0 rows affected (0.00 sec)

mysql [localhost] {msandbox} (test) > SELECT     columnPrimaryKey,     column1,     column2,     column3 FROM     (SELECT         columnPrimaryKey,         column1,         column2,         column3     FROM testTable     ORDER BY column2 ) AS tbl GROUP BY column3;
+------------------+----------------+---------+---------+
| columnPrimaryKey | column1        | column2 | column3 |
+------------------+----------------+---------+---------+
|                5 | Some Name 8-1  |       1 |       8 |
|                6 | Some Name 9-1  |       1 |       9 |
|                8 | Some Name 10-2 |       2 |      10 |
+------------------+----------------+---------+---------+



  1. SQL Server FOR JSON AUTO Příklady (T-SQL)

  2. MySQL a zamkněte tabulku, přečtěte si ji a pak ji ořízněte

  3. Mysql:latin1-> utf8. Převeďte znaky na jejich vícebajtové ekvivalenty

  4. Hibernate negeneruje kaskádu