Mysql
 sql >> Baza danych >  >> RDS >> Mysql

W jaki sposób podgrupy mogą mieć wygenerowaną kolumnę przyrostu dodaną w zapytaniu sql?

Rozwiązałem go dzięki pomocy z najdoskonalszego wpisu na blogu tutaj:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

Rozwiązanie nie jest trywialne, wymaga zmiennych i pewnej zaawansowanej wiedzy o tym, jak mysql porządkuje operacje zapytań, ale wydaje się być dość wydajne. Jednym z kluczy jest to, że przypisania zmiennych mogą być ukryte w wywołaniach funkcji!

Zasadniczo, następujące zapytanie rozwiązuje problem:

SET @num := 0, @type := '';

SELECT name, subgroup, @num AS increment
FROM table_name
WHERE 0 <= GREATEST(
   @num := IF(@type = subgroup, @num + 1, 1),
   LEAST(0, LENGTH(@type := subgroup)))

Funkcje GREATEST , LEAST i LENGTH są tylko pojemnikami na zmienne zadania. Jak widać, te funkcje zasadniczo nie wpływają na wynik zapytania.

Jednak odkryłem również, że w mojej tabeli mam wartości „podgrup”, które nie są kolejne. Na przykład:

+------+----------+
| name | subgroup |
+------+----------+
| john | 1        |
| doe  | 1        |
| jim  | 1        |
| greg | 2        |
| boe  | 2        |
| amos | 3        |
| ben  | 1        |
| gary | 2        |
+------+----------+

Wynikiem jest tabela wyjściowa, taka jak:

+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1        |         1 |
| doe  | 1        |         2 |
| jim  | 1        |         3 |
| greg | 2        |         1 |
| boe  | 2        |         2 |
| amos | 3        |         1 |
| ben  | 1        |         1 |
| gary | 2        |         1 |
+------+----------+-----------+

Zatwierdzanie ORDER BY klauzula na końcu zapytania nie działała ze względu na kolejność wykonywania i ukrywanie przypisań zmiennych w ORDER BY klauzula była bliższa, ale miała swoje własne problemy, więc oto ostatnie zapytanie, którego użyłem:

SET @num := 0, @type := '';

SELECT name, subgroup, @num AS increment
FROM (SELECT * FROM table_name ORDER BY subgroup) AS table_name2
WHERE 0 <= GREATEST(
   @num := IF(@type = subgroup, @num + 1, 1),
   LEAST(0, LENGTH(@type := subgroup)))

Daje to następujące dane wyjściowe:

+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1        |         1 |
| doe  | 1        |         2 |
| jim  | 1        |         3 |
| ben  | 1        |         4 |
| greg | 2        |         1 |
| boe  | 2        |         2 |
| gary | 2        |         3 |
| amos | 3        |         1 |
+------+----------+-----------+

Hurra!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Transakcje w MySQL — nie można wycofać

  2. SQL LEFT-JOIN na 2 polach dla MySQL

  3. Czy PDO ext PHP7 odczytuje cały zestaw wyników do pamięci?

  4. JS Nie można wysłać zapytania do bazy danych MySQL. BŁĄD:connection.query nie jest funkcją

  5. Jak usunąć wiodące i końcowe spacje w MySQL?