Java MySQL按主键按DESC顺序动态排序

Java MySQL按主键按DESC顺序动态排序,java,mysql,sql-order-by,limit,Java,Mysql,Sql Order By,Limit,我试图根据主键列按降序查询表 以下是查询: SELECT * FROM fdmsus_demo.vitalstats ORDER BY ( SELECT `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE (`TABLE_SCHEMA` = 'fdmsus_demo') AND (`TABLE_NAME` = 'vitalstats') AND (`COLUMN_KEY` = 'PRI') ) DESC LIMIT 10;

我试图根据主键列按降序查询表

以下是查询:

SELECT * FROM fdmsus_demo.vitalstats
ORDER BY 
( SELECT `COLUMN_NAME`
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'fdmsus_demo')
  AND (`TABLE_NAME` = 'vitalstats')
  AND (`COLUMN_KEY` = 'PRI') 
 ) DESC LIMIT 10; 
我希望此查询以降序返回行。然而,它并没有像预期的那样工作。我觉得DESC没有被应用到查询中。 我以这种方式编写查询的原因是,我想在Java代码中使用此查询,它将参数化函数,如:

public void myFunction(String dbName, String tableName);
因为在运行时,我不知道什么是表的主键。但是,我只提供了两个参数dbname和tablename。因此,使用以下子查询获取主键列名:

( SELECT `COLUMN_NAME`
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'fdmsus_demo')
  AND (`TABLE_NAME` = 'vitalstats')
  AND (`COLUMN_KEY` = 'PRI') 
 )
上述查询相当于:

SELECT * FROM fdmsus_demo.vitalstats ORDER BY VitalsMasterKey DESC LIMIT 10;
它按预期的降序返回结果

有谁能帮我更正查询并按降序获得输出。任何帮助都将不胜感激


谢谢。

尝试将desc应用于内部查询

SELECT * FROM fdmsus_demo.vitalstats
ORDER BY 
( SELECT `COLUMN_NAME`
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'fdmsus_demo')
  AND (`TABLE_NAME` = 'vitalstats')
  AND (`COLUMN_KEY` = 'PRI') 
ORDER BY COLUMN_NAME DESC LIMIT 10;
) ORDER BY COLUMN_NAME DESC LIMIT 10;
这应该可以。您缺少需要在内部查询中应用desc函数的内容。

试试这个,它会起作用的

set @Query1=Concat('SELECT * FROM fdmsus_demo.vitalstats ORDER BY ', (SELECT `COLUMN_NAME`
    FROM `information_schema`.`COLUMNS`
    WHERE (`TABLE_SCHEMA` = 'fdmsus_demo')
      AND (`TABLE_NAME` = 'vitalstats')
      AND (`COLUMN_KEY` = 'PRI')),' desc limit 10');

 PREPARE stmt FROM @Query1; 
 EXECUTE stmt;  

你必须写一份声明

SET @col = '';
SELECT `COLUMN_NAME` INTO @col
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'fdmsus_demo')
  AND (`TABLE_NAME` = 'vitalstats')
  AND (`COLUMN_KEY` = 'PRI');
SET @q = CONCAT('SELECT * FROM fdmsus_demo.vitalstats ORDER BY ',@col,' DESC LIMIT 10');
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

谢谢你的快速回复。但遗憾的是,它不起作用,甚至限制也不起作用。然而,在我的查询中,我至少能够限制它。谢谢你的帮助,伙计。但是你知道我遗漏了什么吗?你有没有尝试在你想要排序的外部查询上传递列名?从fdmsus_demo.vitalstats顺序中选择*通过从信息_schema.COLUMNS中选择列_NAME,其中表_schema='fdmsus_demo',表_NAME='vitalstats',列_KEY='PRI''COLUMN_NAME'DESC LIMIT 10;不,即使这样也不行。外部查询上的列名将是从内部查询中获取的列名。您是否也尝试过使用join??选择v.VID,v.thumb FROM video AS v internal JOIN从视频中选择VID,其中标题为%'。$Channel['name'].%ORDER BY viewtime DESC LIMIT 5 AS v2 ON v.VID=v2.VID按RAND或column_name LIMIT排序1@mahendrakawde选择*从用户权限,其中id插入从用户按id顺序选择id按id顺序限制5;|id | user | u id | permission | 1 | 1 | abc | 2 |-1 | abcde | 3 |-1 | abcdw | 1 | 5 |-1 | ab |++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+。你能检查一下这个在你的情况下是否有效吗?如果不行,你能告诉我还有什么遗漏吗?我申请了内部查询,但不起作用。请出示您的查询。谢谢您的回复。但你能不能给我一个简单的sql格式,因为它是SP。它正在工作,但我想在Java代码中使用它,并将使用JdbcTemplate执行。那么,有什么替代concat的方法吗?首先使用concat,如果有,请告诉我们issue@mahendrakawde您缺少的是不能将数据与查询混合。在sql中,您不能使用数据(例如子查询返回的字符串形式的主键名称)作为外部查询sql代码的一部分并按其排序结果集。时期MySQL中的解决方法就是这个答案所展示的:首先检索主键的名称,然后使用这段数据通过字符串连接动态创建另一条sql语句并执行它。您也可以在java中执行同样的操作:首先检索pk,然后组装实际的sql语句,然后执行它。上面的代码是纯sql代码,应该也可以从java执行。是否适合java模板,我不知道。然而,这个查询暗示了一个严重的设计缺陷:究竟为什么您不知道给定表的PK是什么?表格结构不应一时兴起而改变。将其分为两个步骤如何?首先获取主列名,然后查询按此列排序的结果。