2017-06-20 2 views
0

J'essaie d'interroger une table dans l'ordre décroissant en fonction de sa colonne de clé primaire.Ordre MySQL par clé primaire de manière dynamique dans l'ordre DESC

Voici la requête:

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; 

J'attends cette requête pour renvoyer les lignes dans l'ordre décroissant. Cependant, cela ne fonctionne pas comme prévu. Je pense que DESC n'est pas appliqué à la requête. La raison pour laquelle je suis en train d'écrire la requête de cette façon est, je voulais utiliser cette requête dans mon code Java et il fonctionnera paramétrés comme:

public void myFunction(String dbName, String tableName); 

Parce que lors de l'exécution, je ne vais pas savoir ce sera le principal clé d'une table. Cependant, je ne fournis que 2 paramètres dbname et tablename. Par conséquent aller chercher le nom de colonne de clé primaire à l'aide suivante sous-requête:

(SELECT `COLUMN_NAME` 
FROM `information_schema`.`COLUMNS` 
WHERE (`TABLE_SCHEMA` = 'fdmsus_demo') 
    AND (`TABLE_NAME` = 'vitalstats') 
    AND (`COLUMN_KEY` = 'PRI') 
) 

Au-dessus de la requête est équivalente à:

SELECT * FROM fdmsus_demo.vitalstats ORDER BY VitalsMasterKey DESC LIMIT 10; 

Ce qui renvoie un résultat par ordre décroissant comme prévu.

Quelqu'un peut-il s'il vous plaît m'aider à corriger la requête et obtenir la sortie dans l'ordre décroissant. Toute aide serait appréciée.

Merci.

+0

Que diriez-vous séparer cela en deux étapes? Récupérez d'abord le nom de la colonne primaire, puis le résultat de la requête trié par cette colonne. – Blank

Répondre

0

Essayez d'appliquer desc à la requête interne.

+0

J'ai appliqué à la requête interne mais ne fonctionnait pas. Pouvez-vous montrer la requête s'il vous plaît. –

-1
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; 

Ceci devrait faire l'affaire. Il vous manque sur lequel vous devez appliquer la fonction desc dans la requête interne.

+0

Merci pour votre réponse rapide. Mais triste de dire que cela ne fonctionne pas et même Limit ne fonctionne pas. Cependant dans ma requête je suis capable de le limiter au moins. Merci pour votre aide. Mais avez-vous une idée de ce qui me manque? –

+0

Avez-vous essayé de transmettre le nom de la colonne sur la requête externe sur laquelle vous souhaitez trier? SELECT * FROM fdmsus_demo.vitalstats ORDER BY (SELECT '' COLUMN_NAME' DE information_schema'.'COLUMNS' OU ('TABLE_SCHEMA' = 'fdmsus_demo') ET (' TABLE_NAME' = 'vitalstats') ET ('COLUMN_KEY' = 'PRI') ) 'COLUMN_NAME' DESC LIMIT 10; –

+0

Non, même cela ne fonctionne pas. COLUMN_NAME sur la requête externe sera extrait du nom de la colonne à partir de la requête interne. –

0

Essayez cela, il travaillera

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; 
+0

Merci pour la réponse. Mais pouvez-vous me le donner en format sql simple comme c'est SP. –

+0

C'est le format mysql seulement .. Vous pouvez utiliser directement. – user1960808

+0

Cela fonctionne mais je veux l'utiliser dans le code Java et sera exécuté en utilisant JdbcTemplate. Alors Y a-t-il une alternative à concat()? –

0

Vous devez écrire préparer la déclaration

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;