0

我妈妈想为我兄弟的婴儿洗澡准备一个婴儿名字游戏。想学python,就自告奋勇。我几乎有 python 位,这是抛出我的 SQL。

游戏应该运行的方式是淋浴的每个人都在纸上写下名字,我手动将它们输入 Excel(尽可能规范拼写)并导出到 MS Access。然后我运行我的 python 程序来查找具有最流行名称的播放器和具有最独特名称的播放器。名为“babynames”的数据库只有四列。

ID | BabyFirstName | BabyMiddleName | PlayerName
---|---------------|----------------|-----------

我妈妈经常改变一些东西,但就他们现在的情况而言,我必须弄清楚:

a) 所有名字和中间名中最流行的名字(或名字,如果有平局的话)

b) 所有名字和中间名中最独特的名字(或名字,如果有平局的话)

c) 拥有最多热门名字的玩家(赢得奖品)

d) 拥有最多唯一名称的玩家(赢得奖品)

我已经为此工作了大约一个星期,甚至无法获得 a) 和 b) 的 SQL 查询,更不用说 c) 和 d)。我不只是有点沮丧。

顺便说一句,我只看名字的拼写,而不是语音。当我手动输入名称时,我会将“Kris”等名称更改为“Chris”,将“Xtina”更改为“Christina”等。

编辑以添加我尝试过的几个最新查询 a)

SELECT [BabyFirstName], 
       COUNT ([BabyFirstName]) AS 'FirstNameOccurrence' 
FROM [babynames] 
GROUP BY [BabyFirstName] 
ORDER BY 'FirstNameOccurrence' DESC 
LIMIT 1

SELECT [BabyFirstName] 
FROM [babynames] 
GROUP BY [BabyFirstName] 
HAVING COUNT(*) = 
    (SELECT COUNT(*) 
     FROM [babynames] 
     GROUP BY [BabyFirstName] 
     ORDER BY COUNT(*) DESC 
     LIMIT 1)

这些都会导致语法错误。

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in ORDER BY clause. (-3508) (SQLExecDirectW)')

我试过使用 [FirstNameOccurrence] 和 FirstNameOccurrence 以及同样的错误。不知道为什么它不能通过该列名来识别它来排序。

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error. in query expression 'COUNT(*) = (SELECT COUNT(*) FROM [babynames] GROUP BY [BabyFirstName] ORDER BY COUNT(*) DESC LIMIT 1)'. (-3100) (SQLExecDirectW)")

我承认我并没有真正理解这里的所有 COUNT(*) 命令,但这是 stackoverflow 中类似问题的解决方案,我想当我的其他想法没有成功时我会尝试。

4

2 回答 2

0

对于 A 和 B,在 SQL 中使用group by子句,然后计数,然后order by计数。对 A 使用降序,对 B 使用升序,并为每个取第一个结果。

对于 C 和 D,基本上使用相同的策略,但现在只需添加 PlayerName(例如group by babyname,playername),然后使用升序/降序问题。

这是微软对group byMS Access 中的一个条款的描述:https ://office.microsoft.com/en-us/access-help/group-by-clause-HA001231482.aspx

这是一个更好的文章,展示了如何同时做这两个group byorder byhttp: //rogersaccessblog.blogspot.com/2009/06/select-queries-part-3-sorting-and.html

于 2013-08-29T02:38:26.393 回答
0

对于您尝试的第一个查询,将其更改为:

SELECT TOP 1 [BabyFirstName], 
       COUNT ([BabyFirstName]) AS 'FirstNameOccurrence' 
FROM [babynames] 
GROUP BY [BabyFirstName] 
ORDER BY 'FirstNameOccurrence' DESC

对于第二个,将其更改为:

SELECT [BabyFirstName] 
FROM [babynames] 
GROUP BY [BabyFirstName] 
HAVING COUNT(*) = 
    (SELECT TOP 1 COUNT(*) 
     FROM [babynames] 
     GROUP BY [BabyFirstName] 
     ORDER BY COUNT(*) DESC)

Access中限制SQL语句返回的记录数是通过TOP直接在后面添加语句来实现的SELECT,而不是ORDER BY... LIMIT

此外,AccessTOP语句将返回前 n 个(或 n%)唯一记录的所有实例,因此如果查询输出(在 TOP 之前)中有两个或多个相同的记录,并且TOP 1已指定,您将看到它们全部。

于 2013-08-29T03:31:10.177 回答