将列表的每次出现限制为1

时间:2017-03-11 23:05:34

标签: javascript mysql node.js express mysqli

我有以下查询打印出一个数字列表。我想将每个唯一编号限制为1。

例如,如果数据库中有三个18,它将打印出18,18,18,如果它们是两次出现的5,它将打印出5,5。在这种情况下,我只能看到18和5。

 let sqlSelectBoxInformation = "SELECT longestDimension from box ";

     connectionBoxInformation.query(sqlSelectBoxInformation, function(err, rows, fields) {

    if (!err) {
      // Check to see if the user entered hashtag is found in the database
      // Create a variable to track if the item was found


            var data = {
             rows: rows,
             userHashtag: databaseHashtag
            }
            res.render('delivery/chooseBox', data);

    }



          });

2 个答案:

答案 0 :(得分:2)

您可以使用DISTINCT

SELECT DISTINCT longestDimension from box

GROUP BY

SELECT longestDimension from box GROUP BY longestDimension

答案 1 :(得分:1)

请注意,DISTINCT始终适用于所有返回的列。将括号括在一列中对其行为没有影响。

如果您希望结果在处理longestDimension或多列时仅包含subquery的唯一值,则可以使用GROUP BY子句 - 但是您必须决定一些要在其他列中返回值的规则。您可以使用MIN()MAX()COUNT()SUM()等汇总函数来执行此操作。

简化示例:

SELECT  SG.SGID,
    MIN(SG.START_TIME),              --the lowest start time for this sgid.
    COUNT(DISTINCT en.EnrollmentID)  --the unique enrollments for this sgid.
FROM StudentGroups SG 
INNER JOIN Enrollments EN ON SG.SGID = EN.SGID
GROUP BY SG.SGID;

(对于上下文SG,这里代表StudentGroup。)在原始查询中连接多个表时,在计算和求和时必须小心,因为连接中的重复项可以为您提供结果不正确。

另一种选择是使用ROW_NUMBER()为每个SGID返回一行:

SELECT * FROM (
    SELECT  SG.SGID,
        SG.START_TIME, 
        en.EnrollmentID,
        ROW_NUMBER() OVER (PARTITION BY SGID ORDER BY SG.START_TIME) as RN
    FROM StudentGroups SG 
    INNER JOIN Enrollments EN ON SG.SGID = EN.SGID
)
WHERE RN = 1;

这为每个SGID的行编号,从1开始,并按SG.START_TIME的值排序。它将返回每行SGID的最早开始时间的一行。如果多行具有相同的开始时间,则会随机选择其中任何一行,或多或少。您可以向ORDER BY子句添加更多字段,以进一步定义返回的行。