2016-04-13 9 views
1

PhalconのQueryBuilderを使用して、フルモデルオブジェクトを返すクエリを作成しています。私は「セメスター」列でクエリを時系列順に並べ替える必要があります。問題は列の内容が「F」、「W」、「G」、「S」です。これはソートする値が必要な順序です。したがって、「F」を含むすべての行が最初に来て、 W "などアルファベット順ではない列でクエリを並べ替える方法

最初に私はMySQL FIELD()関数を使って注文しようとしましたが、例外を解析していましたので、PDOがサポートしているとは思いません。私はいずれかの方法で文書を見つけることができませんでした。

次に、QueryBuilderの->columns()メソッドを使用しようとしましたが、すべての列の名前が変更され、戻り値の型がモデルオブジェクトではありません。

QueryBuilderをドロップし、生のSQLクエリを使用することはできません。私は、複雑なフレームワークをQueryBuilderの周りに構築しており、書き直すにはあまりにも多くの作業が必要です。

最後に、 "F"が0、 "W"が1などのように、データベースに "semester"がどのように格納されているかを変更するだけです。コードで作業する

アイデア?

答えて

2

のようなあなたの順序を定義するためにFIND_IN_SET()関数を使用することができますorderBy関数:

"CASE 
WHEN Semester = 'F' THEN 0 
WHEN Semester = 'W' THEN 1 
WHEN Semester = 'G' THEN 2 
ELSE 3 
END" 
+0

これは作業にかなり近いです。このフォーマットは、例外を引き起こしたので、私はそれ以外の場合の形式に変更された: CASE 学期 WHEN 'W' THEN 1 WHEN 'G' THEN 2 ときに 'S' 3 ときに 'F' 4 終わり – Pickle

1

あなたはして参加しようとすることができ、ユーザ定義この

SELECT * 
FROM yourtable 
INNER JOIN 
(SELECT 'F' as code,0 as sequence 
UNION 
SELECT 'W' as code,1 as sequence 
UNION 
SELECT 'G' as code,2 as sequence 
UNION 
SELECT 'S' as code,3 as sequence) 
as T ON T.code = yourtable.column 
ORDER BY T.sequence ASC 

のように選択するか、あなたはあなたがこの文字列を試みることができるこの

SELECT 
    *, 
    FIND_IN_SET(code,'F,W,G,S') as sequence 
FROM semester 
ORDER BY sequence ASC 
+0

ありがとうございました。私はこのトピックを研究する前に、このようなクエリの形を見てきました。しかし、私はPhalconのQueryBuilderを特に使用していますが、これはこの構造のクエリを可能にしません。とにかくありがとう。 – Pickle

+0

PhalconのQueryBuilderで2番目(私の答えの一番下)のクエリを作成できますか? –

+0

助けてくれてありがとう。私は@ PaulFの答えと一緒に行った。 – Pickle

関連する問題