如何将这些数据分组?

时间:2019-03-16 10:04:11

标签: python mysql tuples

我有一个项目数据库,每个项目都有5个属性。它们由SQL查询返回,如下所示:

  

(ID,名字,姓氏,组,年份)

例如:

  

(1,“杰克”,“威廉姆斯”,“ S”,5)

我的SQL查询非常简单:SELECT * FROM people;

我想做的是按字母顺序将它们分组,然后按年份按升序将其分组,并且应按姓氏按字母顺序对它们进行分组。

因此它应该产生如下内容:

  

((((((((1,“ Roger”,“ Acaster”,“ A”,5),(15,“ Jamie”,“ Atkins”,“ A”,5),   ...),((30,“爱丽丝”,“科尔威尔”,“ A”,6),(37,“查尔斯”,“爱德华兹”,   “(A ,, 6),...),...),((((92,” Grace“,” Barnes“,” B“,5),...),(((104,   “ Matthew”,“ Crawley”,“ B”,6),...),...),...)

因此,如果我们将该元组称为people_array

  • people_array[0]应该返回第一个字母最接近或等于“ A”的第一组。

  • people_array[0][0]应该返回数字最少的第一年。

  • people_array[0][0][0]应该在第一年返回第一组中姓氏首字母最接近或等于“ A”的人。

目前,SQL查询以如下方式返回它:

  

(((1,“ Roger”,“ Acaster”,“ A”,5),(...),(...),...)

即只是每个人的清单,首先按组排序,然后在按年排序的列表中。

我不知道这是否可以在MYSQL中实现,或者一旦我以上述形式从SQL返回了它,也许就需要使用Python来完成。无论哪种方式,我都不知道如何达到预期的效果。

有人可以帮我吗?

谢谢。

编辑:目前,我的想法是按字母顺序遍历每个组,然后按字母顺序遍历每年,并对每个查询,如下所示:

people = []
groups = ["A", "B", "D", "F", "S", ...]
years = [5, 6, 7, 8, 9, ...]

for group in groups:
    temp_group = []
    for year in years:
        query = "SELECT * FROM people WHERE group='{}' AND year={} ORDER BY Surname".format(group, year)
        temp_group.append(make_query(query))
    pupils.append(temp_group)

尽管这看起来效率很低,但很重要,因为我将非常频繁地运行此查询。

1 个答案:

答案 0 :(得分:1)

使用SQL ORDER BY

这将根据您定义的字段对数据进行排序。

您可以在http://www.compileonline.com/execute_sql_online.php

中测试以下SQL
BEGIN TRANSACTION;

/* Create a table called people */
CREATE TABLE people(id integer PRIMARY KEY,
                    name text,
                    surname text,
                    grp text,
                    year integer);

/* Create few records in this table */
INSERT INTO people VALUES(1,'Tom','Tom1','g1',1987);
INSERT INTO people VALUES(2,'Lucy','Lucy1','g1',1756);
INSERT INTO people VALUES(3,'Frank','Frank1','g2',2000);
INSERT INTO people VALUES(4,'Jane','Jane1','g3',1897);
INSERT INTO people VALUES(5,'Robert','Robert1','g4',2000);
COMMIT;

/* Display all the records (orderd) from the table */
SELECT * FROM people order by grp asc, year asc,surname asc ;