2017-07-25 1 views
0

J'ai reçu une requête et je veux que wort trie le résultat en fonction d'une autre base de données.Trier les requêtes MySQL ASC ou DESC en fonction de la valeur de l'autre table

C'est ma requête:

SELECT a.`name` 
FROM  `article` AS a 
LEFT JOIN `container` AS b 
     ON b.`id` = a.`container` 
WHERE  a.`container` = '1' 
ORDER BY b.`sort` ASC; 

Cela fonctionne bien, mais il trie toujours le résultat croissant. Bute Je veux que ist soit trié en fonction de la valeur dans la table conteneur.

Article table 

id | container | name | gender 
---|---------------------|--------- 
1 | 1   | Michael | male 
2 | 1   | Joe  | male 
3 | 2   | Karen | female 
4 | 2   | Andrew | male 
5 | 3   | Jessica | female 


Container table 

id | sort | order 
---|--------|---- 
1 | name | asc 
2 | name | desc 
3 | gender | asc 
4 | name | asc 
5 | gender | desc 

Comment puis-je modifier ma requête pour obtenir la commande à partir de la table conteneur?

Je me attends à ce résultat:

id | container | name | gender 
---|---------------------|--------- 
2 | 1   | Joe  | male 
1 | 1   | Michael | male 

Répondre

0

Est-ce que quelque chose comme ce travail?

ORDER BY CASE WHEN b.`order` = 'ASC' b.`sort` ELSE -b.`sort` END; 

Sinon s'il vous plaît fournir quelques exemples de données et le résultat attendu pour ces données afin que nous puissions mieux comprendre vos besoins.

+0

j'ai changé ma question et espère que le problème se précise. – Deen

+0

pourriez-vous s'il vous plaît ajouter le résultat attendu. – JeffUK

1

Vous ne pouvez pas le faire en une seule requête.

Une requête SQL donnée doit être corrigée au moment de la préparation de la requête, avant le début de l'exécution. Vous ne pouvez pas modifier le comportement en fonction des données qu'il découvre lors de l'exécution.

Vous devrez lire le sens du tri dans une requête, puis formater une requête SQL dynamique avec les valeurs que vous avez découvertes.

SELECT `sort`, `order` FROM container WHERE id = 1 

Fetch ces données dans les variables d'application comme $sort_column, $direction. Puis les utiliser:

$sql = " 
    SELECT a.`name` 
    FROM  `article` AS a 
    WHERE  a.`container` = '1' 
    ORDER BY {$sort_column} {$direction}"; 

...prepare $sql as a query... 

...execute query... 

(Je suppose la syntaxe PHP pour les variables, mais vous pouvez faire quelque chose de similaire dans toutes les langues.)

+0

D'accord. J'ai montré que ce serait possible avec des colonnes numériques en utilisant un ensemble d'instructions 'case' imbriquées pour inverser dynamiquement les valeurs numériques et les trier; cela deviendrait très lourd lorsque le nombre de colonnes augmenterait. Mais avec des cordes, ce serait un énorme jeu impliquant de trouver les valeurs ASCII et de les écraser ensemble. Ce genre d'exigence dynamique est là où les langages procéduraux sont idéaux. – JeffUK