Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在包含重复项的列中选择前5项_Mysql_Sql - Fatal编程技术网

Mysql 在包含重复项的列中选择前5项

Mysql 在包含重复项的列中选择前5项,mysql,sql,Mysql,Sql,我已经编写了一个查询,它给了我一个数据列表,我需要选择前5条数据。比如说 Num Name 5 a 4 b 4 c 2 d 1 e 1 f 1 g 0 h 然而,如果我只使用limit5,这就省去了名为f和g的数据点。我怎样才能从a-h中进行选择。这只是一个示例数据块。我的实际数据包含更多的行,因此我可以简单地排除底部的行。 编辑抱歉,当我说前5名时,我指的是前5名。所以5,4,2,1,0但是1有重复项,所以我想选择所有这些重复项,我想您需要这

我已经编写了一个查询,它给了我一个数据列表,我需要选择前5条数据。比如说

Num  Name
5    a
4    b
4    c
2    d
1    e
1    f
1    g
0    h
然而,如果我只使用limit5,这就省去了名为f和g的数据点。我怎样才能从a-h中进行选择。这只是一个示例数据块。我的实际数据包含更多的行,因此我可以简单地排除底部的行。
编辑抱歉,当我说前5名时,我指的是前5名。所以5,4,2,1,0但是1有重复项,所以我想选择所有这些重复项,我想您需要这样的查询:

SELECT *
FROM (
    SELECT t1.Num, t1.Name, COUNT(DISTINCT t2.Num) AS seq
    FROM yourTable t1
        LEFT JOIN
        yourTable t2
        ON t1.Num <= t2.Num
    GROUP BY t1.Num, t1.Name) dt
WHERE (seq <= 5);

我认为您需要这样的查询:

SELECT *
FROM (
    SELECT t1.Num, t1.Name, COUNT(DISTINCT t2.Num) AS seq
    FROM yourTable t1
        LEFT JOIN
        yourTable t2
        ON t1.Num <= t2.Num
    GROUP BY t1.Num, t1.Name) dt
WHERE (seq <= 5);
检查此查询

SELECT 
t1.Num, 
t1.Name,
FIND_IN_SET(t1.Num, SUBSTRING_INDEX(
       GROUP_CONCAT(DISTINCT(t2.Num ) ORDER BY t2.Num DESC), ',', 5)
) AS Ord
FROM yourTable t1
LEFT JOIN yourTable t2 ON(t2.Num IS NOT NULL)
GROUP BY t1.Name
ORDER BY t1.Num ASC
检查此查询

SELECT 
t1.Num, 
t1.Name,
FIND_IN_SET(t1.Num, SUBSTRING_INDEX(
       GROUP_CONCAT(DISTINCT(t2.Num ) ORDER BY t2.Num DESC), ',', 5)
) AS Ord
FROM yourTable t1
LEFT JOIN yourTable t2 ON(t2.Num IS NOT NULL)
GROUP BY t1.Name
ORDER BY t1.Num ASC

您可以通过在SQL逻辑中添加具有增量行号的新字段进行计算,如下所示:

Feeds  Num  Name
  1     5    a
  2     4    b
  2     4    c
  3     2    d
  4     1    e
  4     1    f
  4     1    g
  5     0    h
然后将结果限制在案例5中所需的等级。以下是供您参考的SQL:

SELECT num, name from (
SELECT @row_number:=CASE WHEN @num=num 
THEN @row_number ELSE @row_number+1 END AS feeds,@num:=num AS num, name
FROM table1, (SELECT @row_number:=0,@num:='') AS t
ORDER BY num desc 
  )t1
  WHERE feeds <= 5

您可以通过在SQL逻辑中添加具有增量行号的新字段进行计算,如下所示:

Feeds  Num  Name
  1     5    a
  2     4    b
  2     4    c
  3     2    d
  4     1    e
  4     1    f
  4     1    g
  5     0    h
然后将结果限制在案例5中所需的等级。以下是供您参考的SQL:

SELECT num, name from (
SELECT @row_number:=CASE WHEN @num=num 
THEN @row_number ELSE @row_number+1 END AS feeds,@num:=num AS num, name
FROM table1, (SELECT @row_number:=0,@num:='') AS t
ORDER BY num desc 
  )t1
  WHERE feeds <= 5

你的问题看起来怎么样?我很困惑。选择数据的完整条件是什么?限制5将返回5行。你还想从a-h中选择是什么意思?很明显,超过5行。你的问题不是很清楚。前5行到底是什么意思?你的预期输出是什么?仍然不清楚。你的查询看起来怎么样?我很困惑。选择数据的完整条件是什么?限制5将返回5行。你还想从a-h中选择是什么意思?这显然超过了5行。您的问题不太清楚。前5行到底是什么意思?您的预期输出是什么?仍然不清楚。此解决方案在大型表上的效率要比公认的解决方案高得多。此解决方案在大型表上的效率要比公认的解决方案高得多。不幸的是,此查询在大型表上速度较慢。如果该表有n行,则在计数之前,联接会产生n*n+1行。不幸的是,对于大型表,此查询速度较慢。如果表有n行,则在计数之前,有n*n+1行由联接产生。