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

Jak by mohly mít podskupiny vygenerovaný sloupec přírůstku přidaný v dotazu SQL?

Vyřešil jsem to díky pomoci z nejlepšího blogového příspěvku zde:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

Řešení je netriviální, vyžaduje proměnné a určité pokročilé znalosti o tom, jak mysql objednává své operace dotazů, ale zdá se, že je poměrně výkonné. Jedním z klíčů je, že přiřazení proměnných lze skrýt ve volání funkcí!

Následující dotaz v podstatě řeší problém:

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

Funkce GREATEST , LEAST a LENGTH jsou zde pouze jako kontejnery pro přiřazení proměnných. Jak vidíte, tyto funkce v podstatě neovlivňují výstup dotazu.

Zjistil jsem však také, že ve své tabulce mám hodnoty „podskupiny“, které nejsou po sobě jdoucí. Například:

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

Výsledkem je výstupní tabulka takto:

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

Přizpůsobení ORDER BY klauzule na konci dotazu nefungovala kvůli pořadí provedení a skrytí přiřazení proměnných v ORDER BY klauzule se přiblížila, ale měla své vlastní problémy, takže zde je poslední dotaz, který jsem použil:

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

Výsledkem je následující výstup:

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

Hurá!



  1. Mysql LEFT JOIN tří tabulek se vrátí do mnoha řádků

  2. Vytváří rozdělení v mysql tabulky nebo pouze virtuální tabulky?

  3. Základy automatizace úloh serveru SQL Server

  4. Jak přejmenovat sloupec tabulky v Oracle 10g