使用NodeJS在SQL数据库中查找编号最高的行,该行也与ID相匹配?

问题描述

为此,我有一个结构如下的数据库

╔═════╦══════════════╦══════╗
║ Name║ ValueForName ║ Num  ║
╠═════╬══════════════╬══════╣
║  A  ║ Jeff Atwood  ║ 5636 ║
║  A  ║ Geoff Dalgas ║  120 ║
║  A  ║ Jarrod Dixon ║  340 ║
║  B  ║ Joel Spolsky ║  959 ║
║  B  ║ Mark Brenna  ║ 7389 ║
║  B  ║ Anth Daverse ║  148 ║
║  C  ║ Ann Jefferse ║  101 ║
║  C  ║ Bonita Thorn ║  959 ║
║  C  ║ Bella Johnss ║  959 ║
╚═════╩══════════════╩══════╝

目标是能够找到特定类别中人数最多的人。因此,我想在“ A”名称组中找到编号最高的人,在“ B”名称组中编号最多的人,以及在“ C”名称组中编号最高的人。因此,在此数据库中,A组中最高的是Jeff Atwood,B组中最高的是Mark Brenna,C组中最高的是Bonita Thorn和Bella Johnss之间的平局。如果是平局,则只会选择最近的。 现在,我正在尝试编写一些NodeJS代码,这些代码将对此数据库执行查询以产生类似于以下内容的数组的输出

people = ("Jeff Atwood","Mark Brenna","Bonita Thorn")

您会看到人数最多的人被放入数组。 我正在考虑做类似的事情

const PLLNames = ["A","B","C"];
var sql = "SELECT ValueForName FROM database WHERE Name= " + con.escape(PLLNames[index]);

然后循环遍历,但是这段代码实际上无法找到最大的数字。

有人知道我将如何构建这样的东西吗?

解决方法

如果您想要联系,这应该可以工作:

var sql = @"
    SELECT t.*
    FROM   databaseTable t
           JOIN
    (
        SELECT DISTINCT
               groupLetter,MAX(ValueForName) AS maxValueForName
        FROM   databaseTable
        GROUP BY groupLetter
    ) a ON a.groupLetter = t.groupLetter
           AND a.maxValueForName = t.ValueForName;
 ";

在示例数据中,C组中的两个名称之间有联系,因此它们都将被返回。

结果:

groupLetter fullName    ValueForName    
A   Jeff Atwood      5636   
B   Mark Brenna      7389   
C   Bella Johnss      959   
C   Bonita Thorn      959

如果您希望根据姓名的字母顺序来决定平局,那么您可以这样做:

SELECT groupLetter,fullName,ValueForName
FROM
(
    SELECT t.*,ROW_NUMBER() OVER(PARTITION BY t.groupLetter
           ORDER BY t.fullName) AS rowNum
    FROM   databaseTable  t
           JOIN
    (
        SELECT DISTINCT 
               groupLetter,MAX(ValueForName) AS maxValueForName
        FROM   databaseTable 
        GROUP BY groupLetter
    ) a ON a.groupLetter = t.groupLetter
           AND a.maxValueForName = t.ValueForName
) b
WHERE  rowNum = 1;

结果:

groupLetter fullName    ValueForName
A   Jeff Atwood      5636
B   Mark Brenna      7389
C   Bella Johnss      959

否则,如果还有另一列确定谁先达到该值,则可以使用它。