2016-08-18 2 views
1

Ich habe eine Tabelle in einer MySQL-Datenbank bestellen, die wie folgt aussieht:Wie BY 'name + 0' in codeigniter (mysql)

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

Wenn ich die Tabelle mit folgenden Methode sortieren:

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

ich erhalte die Tabelle, um folgende:

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

Aber ich will eigentlich die Tabelle in dieser Reihenfolge erhalten:

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

Dies ist möglich, folgende SQL-Anweisung:

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

Aber wenn ich codeIgniters Query Builder wie folgt verwenden erhalte ich einen Datenbankfehler:

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

Beachten Sie, dass es nicht möglich ist, in meiner Situation, um entweder die Zahlen in einer anderen Spalte oder Reihenfolge nach ID zu speichern.

Gibt es also eine Möglichkeit, diese SQL-Anweisung in CodeIgniters Query Builder funktionieren zu lassen?

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

Vielen Dank im Voraus

EDIT: '' Ich bin sehr leid für die Verwirrung, aber die in 1.1 war nicht als Gleitkomma gedacht, aber als ein Punkt wie in: 1.1.1, 1.1.2, 1.1.3 Ich habe eine Lösung mit @Marc B Lösung gefunden und setzen Sie es in den Abfrage-Generator wie folgt:

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

Vielen Dank sehr viel für Ihre Antworten

Antwort

2

ein abgeleitetes Feld und einen Aliasnamen verwenden?

+0

Das funktioniert eigentlich nicht. –

2

Ich denke, dass Sie zuerst nach der Nummer dann durch den Text bestellen sollten.

Demonstration:

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; 

Ausgang:

numberPart  textPart 
    1.1   some other words 

Hier ist die vollständige Abfrage:

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

See demo

oder Sie können versuchen, die Anzahl String Casting-Typ in Dezimalzahlen.

See Demo

+1

Tolle Idee mit dem Casting. –

0

dies versuchen.

Edited

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

danke das brachte mich ein bisschen näher zu einer Lösung bt Ich erhielt folgenden Fehler: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, um die richtige Syntax in der Nähe von 'ASC, 6)) ASC' in Zeile 6 zu verwenden. SELECT * FROM 'Tabellenname' ORDER BY CAST ASC – TrueStory

+0

erkennt das Komma mit Spaltenwechsel: C und dies ¿-> order_by ('CAST (Name AS DECIMAL (10,6)) ASC')? – Blaztix

+0

Ich sehe, du interpretierst das "." in 1.1 als Gleitkommazahl, tut mir sehr leid für die Verwirrung, aber das war eigentlich als ein Punkt wie 1.1.1, 1.1.2, ... Ich habe eine Methode gefunden, die funktioniert mit @Marc B Lösung und setzen In einem Abfrage-Generator bearbeite ich seine Antwort mit dem Abfrage-Generator, den ich geschrieben habe. – TrueStory

0

Extrahieren Sie die erste Saite (nach dem Beispiel von @ 1000111) und CAST es DECIMAL mit einer Nachkommastelle:

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

In CodeIgniter, es sieht wie folgt aus :

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

Wenn Sie Titel mit mehr Dezimalstellen haben, ändern Sie die DECIMAL-Definition. Zum Beispiel, wenn Sie 1,15 und 1,17 haben, dann brauchen Sie zwei Dezimalstellen, also würden Sie es zu DECIMAL (9, 2) ändern.