mysql 在mariadb中通过select创建4个不同值的tablegroup,按其他值排序

ilmyapht  于 2023-03-28  发布在  Mysql
关注(0)|答案(1)|浏览(127)

从一个表中,我想创建4个不同的“Klasse”在一个选择查询中按KW排序的组。
| 身份证|姓名|克拉塞|共振|千瓦|……|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 四|福尔克内希特|克罗伊茨里特|五百七十|13777|小行星8888|
| 九|阿盖尔尼斯|佐伯雷尔|七一零|小行星120七五|一三四四|
| 十四岁|乌瑟鲁斯|代莫嫩耶格尔|七七零|小行星11|小行星8888|
| ……|……|……|……|……|……|
| 十五岁|贝尔泽普|门奇|六百七十|小行星10||
| ……|……|……|……|……|……|
| 三|洛达尔|巴尔巴尔|四百七十|小行星9876|小行星8888|
| ……|……|……|……|……|……|
| 五|WootanFall|托滕贝施韦勒|八一零|八九五六|小行星8888|
| ……|……|……|……|……|……|
每组4不得包含相同的“Klasse”,下一组必须是下一个最高KW。
所需输出:
| 组名|球员|
| --------------|--------------|
| 组蛋白1|VolkerKnecht,Aergernis,Utherus,Belzepoop|
| 组蛋白2|SiliconWilly Siegesmund Eisenklaus Loddar|
| ……|……|
因此grp 1包含“Klasse”= 1“Kreuzritter”,1“Zauberer”,1“Dämonenjäger”,1“Mönch”,具有最高KW
grp 2:contains“Klasse”= 1“Dämonenjäger”,1“Zauberer”,1“Kreuzritter”,1“Barbar”(第二最佳KW constalation)
grpX可以具有除下一个最高KW组之外的由“Klasse”构成的任何其他构成

fiddle here:http://sqlfiddle.com/#!9/fc2f87/1/0

可能发生的是,我还需要一些更多的where和排除“Klasse”,使这个表来我的愿望
非常感谢

00jrzges

00jrzges1#

我认为你的问题不能用SQL来解决,应该用后端代码来实现。下面是一个封闭的查询,它可以将你的数据分组为4个Klasse

-- 3. start part 3
SELECT CONCAT('group', FLOOR(row_number/4) + 1) AS Groupname, GROUP_CONCAT(Name) AS Players
FROM
  -- 2. start part 2
  (SELECT part1.*, (@row_number := @row_number + 1) AS row_number
  FROM
    -- 1. start part 1
    (SELECT 
         Klasse, Name, KW,
         (@class_rank := CASE WHEN @klasse = Klasse THEN @class_rank + 1 ELSE 0 END) AS class_rank,
         @klasse := Klasse
     FROM valar_date
         CROSS JOIN (SELECT @class_rank := -1, @klasse := '') param1
     ORDER BY Klasse, KW+0 DESC) part1
     -- 1. end part 1
     CROSS JOIN (SELECT @row_number := -1) param2
  ORDER BY part1.class_rank, part1.KW DESC) part2
  -- 2. end part 2
GROUP BY FLOOR(row_number/4);
-- 3. end part 3

上述查询的解释:
1.第1部分:按KW列的值对每个Klasse中的数据进行排序。
1.第2部分:按照第1步的排名值对数据进行排序,然后为每个记录分配行号。这样,数据将从每组的最高排名到最低排名进行排序。
1.第3部分:将每4条记录分组为1组。
在此处观看演示

相关问题