2017-07-25 5 views
0

私はクエリを取得し、別のデータベースに応じて結果をソートします。他のテーブルの値に応じてMySQLのクエリASCまたはDESCをソート

これは私のクエリです:

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; 

これは正常に動作しますが、それは常に結果の昇順にソートされます。 Bute私はistをコンテナテーブルの値に応じてソートします。

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 

どのようにしてクエリを変更して、コンテナテーブルから注文を得ることができますか?

私はこの結果を期待する:

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

答えて

0

は、この作品のようなものをしていますか?

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

お客様の要件をよりよく理解できるように、サンプルデータと期待される結果をご提供ください。

+0

私は私の質問を変更し、問題が明確になります願っています。 – Deen

+0

期待した結果を追加してください。 – JeffUK

1

これは1つのクエリでは実行できません。

クエリを準備するとき、つまり実行が開始される前に、特定のSQLクエリを修正する必要があります。実行中にどのデータが検出されたかによって動作を変更することはできません。

並べ替えの方向を1つのクエリで読み取り、見つかった値で動的SQLクエリをフォーマットする必要があります。

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

$sort_column$directionなどのアプリケーション変数にこれらのデータをフェッチします。そして、それらを使用する:

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

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

...execute query... 

(。私は、変数のためのPHP構文を仮定しているが、あなたはどの言語でも似た何かを行うことができます)

+0

同意します。私は数値列を動的に逆順に並べ替えるためにネストされた 'case'ステートメントのセットを使用することによって数値列で可能であることを示しました。これは列の数が増えるにつれて扱いにくいものになります。しかし、文字列では、ascii値を見つけてそれらをマッシュアップすることを含む大規模なkludgeになります。この種の動的要件は、手続き型言語が理想的であるところです。 – JeffUK

関連する問題