2016-08-18 10 views
1

CodeIgniterは(MySQLの)に '名前+ 0'、ORDER BYする方法:私はこのようになりますMySQLデータベースのテーブルを持っている

$this->db->select('*') 
    ->order_by('name', 'ASC') 
    ->get('table_name'); 
:私は次のメソッドを使用してテーブルを並べ替える場合は

id | name 
1 | 1 some words 
2 | 2 some other words 
3 | 1.1 some other words 
... 
10 | 10 some other words 

私は順序を次の表を受け取る:

id | name 
1 | 1 some words 
3 | 1.1 some other words 
10 | 10 some other words 
... 
2 | 2 some other words 

しかし、私は実際にこの順序でテーブルを受信したい:

id | name 
1 | 1 some words 
3 | 1.1 some other words 
2 | 2 some other words 
... 
10 | 10 some other words 

これは、SQL文の次使用可能です:

SELECT * FROM database_name.table_name ORDER BY name + 0 ASC; 

しかし、私はこのようcodeIgnitersクエリビルダを使用する場合、私は、データベースのエラーを取得:

$this->db->select('*') 
    ->order_by('name + 0', 'ASC') 
    ->get('table_name'); 

注ことが不可能であることを私の状況では、IDで別の列や順序で番号を格納するかのいずれかです。

このSQL文をCodeIgnitersクエリービルダーで使用できるようにする方法はありますか?

SELECT * FROM database_name.table_name ORDER BY name + 0 ASC; 

事前に感謝

EDIT: '' 私は混乱のために非常に残念ですが、 1.1では1.1.1、1.1.2、1.1.3のように浮動小数点ではありませんでした。 @Marc Bのソリューションを使って解決策を見つけて、次のようにクエリビルダーに入れました:

$query = $this->db->select('name+0 AS name', FALSE)   
    ->order_by('name', 'ASC') 
    ->get('table_name'); 

は派生フィールドとエイリアスを使用してあなたの答えのために非常に多くの

答えて

2

をあなたのすべてをありがとう!

SELECT name+0 AS fakename ... 
ORDER BY fakename 
+0

これは実際には機能しません。 –

2

最初に番号で注文してください。

デモンストレーション:

SET @str := '1.1 some other words'; 

SELECT 
SUBSTRING_INDEX(@str,' ',1)+0 AS numberPart, 
SUBSTRING_INDEX(@str,SUBSTRING_INDEX(@str,' ',1),-1) AS textPart; 

出力:

SELECT 
* 
FROM database_name.table_name 
ORDER BY SUBSTRING_INDEX(name,' ',1)+0, 
SUBSTRING_INDEX(name,SUBSTRING_INDEX(name,' ',1),-1); 

numberPart  textPart 
    1.1   some other words 

ここで完全なクエリです

See demo

または10進数型に数値ストリングをキャストしてみてください。

See Demo

+1

キャスティングで素晴らしいアイデア。 –

0

これを試してみてください。

編集

$this->db->select('*') 
->order_by('CAST(name AS DECIMAL(10,6)) ASC') 
->get('table_name'); 
+0

ありがとうございます。これは、エラーの後に私が受け取った解決策に少し近づいてくれました: SQL構文に誤りがあります。 'ASC、6)の近くで使用する正しい構文については、MySQLサーバのバージョンに対応するマニュアルをチェックしてください)6行目のASC' SELECT * FROM 'table_name' ORDER BY CAST(name AS DECIMAL(10 ASC、6)) ASC – TrueStory

+0

は、列の変更を伴うコンマを認識します:Cと、この¿ - > order_by( 'CAST(名前AS DECIMAL(10,6))ASC')? – Blaztix

+0

私はあなたが '。' 1.1で浮動小数点数として、私は混乱のために非常に残念ですが、これは実際に1.1.1,1.1.2のような点として意味されていた... 私は@マークBソリューションを使用して動作し、クエリビルダーでは、私が書いたクエリビルダーで彼の答えを編集します。 – TrueStory

0

小数点以下1桁でDECIMALCASTそれを(1000111 @の例以下の)最初の文字列を抽出し、:CodeIgniterので

SELECT id 
    , name 
    FROM table_name 
ORDER BY CAST(SUBSTRING_INDEX(name,' ',1) AS DECIMAL (8,1)) 
; 

を、それはこのようになります:

$this->db->select('*') 
    ->order_by('CAST(SUBSTRING_INDEX(name,' ',1) AS DECIMAL (8,1))', 'ASC') 
    ->get('table_name'); 

小数点以下の桁数のタイトルがある場合は、DECIMAL定義を変更します。たとえば、1.15と1.17の場合、2桁の小数点が必要なので、DECIMAL(9,2)に変更します。

関連する問題