sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan undergrupper få tilføjet en genereret stigningskolonne i en sql-forespørgsel?

Jeg har løst det, takket være hjælp fra et fremragende blogindlæg her:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

Løsningen er ikke-triviel, kræver variabler og en vis avanceret viden om, hvordan mysql bestiller sine forespørgselsoperationer, men den ser ud til at være ret effektiv. En af nøglerne er, at variable tildelinger kan skjules i funktionskald!

I det væsentlige løser følgende forespørgsel problemet:

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

Funktionerne GREATEST , LEAST og LENGTH er der bare som containere til variable opgaver. Som du kan se, gør disse funktioner i det væsentlige intet for at påvirke outputtet af forespørgslen.

Jeg fandt dog også ud af, at jeg havde "undergruppe"-værdier i min tabel, som ikke var fortløbende. For eksempel:

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

Resulterede i en outputtabel som sådan:

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

Tager en ORDER BY klausulen i slutningen af ​​forespørgslen virkede ikke på grund af udførelsesrækkefølgen og skjulte variabeltildelinger i ORDER BY klausulen kom tættere på, men havde sine egne problemer, så her er den sidste forespørgsel, som jeg brugte:

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

Resulterer i følgende output:

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

Yay!



  1. Django + MySQL - Ukendt kodning:utf8mb4

  2. Tjek hvilke ID'er fra et sæt, der ikke findes i en tabel

  3. Pivotering af data ved hjælp af to kolonner

  4. Procentdele i MySQL