我有一个项目数据库,每个项目都有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)
尽管这看起来效率很低,但很重要,因为我将非常频繁地运行此查询。
答案 0 :(得分:1)
使用SQL ORDER BY
这将根据您定义的字段对数据进行排序。
您可以在http://www.compileonline.com/execute_sql_online.php
中测试以下SQLBEGIN 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 ;