2016-10-20 2 views
1

Ich habe einige Produkte in dieser Tabelle:Neu eingefügt Daten zeigen, muss zuerst

Id | Name | Order 
------------------ 
3 | Prod3 | 1 
2 | Prod2 | 2 
1 | Prod1 | 3 

Was ich brauche, ist: wenn das Hinzufügen einiger neues Produkt, das neue Produkt das erste von ‚Ordnung‘ bestellt sein sollte (INT) , wie folgt aus:

Id | Name | Order 
------------------ 
4 | NewPr | 1  
3 | Prod3 | 2 
2 | Prod2 | 3 
1 | Prod1 | 4 

Das bedeutet, die andere sein sollen: vorherige Bestellung + 1

Wie erreichen, dass mit SQL?


Derzeit mache ich das (das Gegenteil von dem, was ich brauche jetzt):

Vor Einsatz,

$query = mysqli_query($link, "SELECT `order` FROM `products` ORDER BY `order` DESC LIMIT 1"); 
while($orderData = mysqli_fetch_array($query)) { 
    $lastOrder = $orderData['order']; 
}; 
$newOrder = $lastOrder + 1; 

das neue Produkt die letzte Auftragsnummer erhalte

INSERT INTO `products` (`name`, `order`) 
VALUES ('MyLastestProd', $newOrder) 
Hinzufügen

Danke.

EDIT: Ich benutze diese Zahlen, weil ich in anderen Seite habe eine ziehbare Option für die Bestellung dieser Produkte.

BEARBEITEN 2: Gelöst die Anzeige der Produkte Bestellung durch 'bestellen' DESC. So mit vorherige Bestellung + 1 ist es nützlich für mich. Änderungen, die auch auf die UI-Ziehfunktion angewendet wurden.

+1

Den Datensatz mit einer "Bestellung" von 0 einfügen und dann alle Datensätze aktualisieren, um "Bestellung" um 1 zu erhöhen? – David

+2

Diese Art von Problem tritt normalerweise auf, wenn jemand versucht, ein Problem zu lösen, das nicht existiert. – Strawberry

+0

@david Wie kann ich alle Datensätze erhöhen, ohne den Prozess zu verlangsamen? –

Antwort

3

Würde ein einfacher Weg, dies zu erreichen, wäre zu Ihrer Bestellung Tabellenspalt zu einem Zeitstempel Feld mit dem Namen ändern ‚DateAdded‘ mit einem Standardwert von ‚CURRENT_TIMESTAMP‘

Dann, wenn eine neue Zeile in der Tabelle einfügen Sie tun ihm überhaupt nicht einen Auftrag geben muß, wenn die Zeilen aus einer Tabelle auswählen gerade:

SELECT * FROM MyTable ORDER BY DateAdded DESC 

Dieser Ansatz wäre viel einfacher, auf der Ausführungszeit, anstatt auf jede Zeile in der Tabelle zu aktualisieren.

Aus Interesse, warum müssen Sie eine neue eingefügte Zeile ganz oben haben? Wenn Sie versuchen, nur die letzte Zeile auszuwählen, haben Sie bereits eine ID-Spalte, von der ich annahm, dass sie ein Primärschlüssel mit dem Attribut auto_increment ist?

Warum also nicht einfach die ID-Spalte als Sortierspalte in ausgewählten Abfragen verwenden?

EDIT

einfach Ihre bearbeiten gesehen, sehe ich jetzt.

Sie können sowohl ein Datumsfeld als auch ein Auftragsfeld verwenden, um eine doppelte Sortierung in Ihrer Abfrage durchzuführen. Beispiel: Wenn jedes neue Produkt, das Sie hinzufügen, einen Bestellwert von Null hat und ein Zeitstempel daneben aufgezeichnet wird, können Sie diese immer noch korrekt bestellen und den Benutzern weiterhin erlauben, sie neu zu bestellen.

+1

Der letzte Frage-Edit zeigt an, dass eine benutzerfreundliche dynamische Sortierung erforderlich ist. (Benutzerspezifische Bestellung) – David

+2

Bitte lesen Sie den Bearbeitungshinweis; Dieses System verwendet eine ziehbare Nachbestellung für diese Produkte. Ich denke, ich kann den _timestamp_ nicht nachbestellen. –

+0

Oder dass er seine Orderspalte als Autoinkrement markiert – Imaginaroom

1
INSERT INTO products (name, order) VALUES 
('MyLastestProd', (select count(a.order)+1 as new_order from products a order by a.order desc limit 1)); 

Also, wenn Sie Ihr Produkt auswählen können Sie

select *from products as p order by p.order desc 
+0

Das ist +1 für den Wert des neuen Produkts, was das Gegenteil von dem ist, mit dem ich Hilfe benötige. –

+0

@JimmyAdaro Ich habe meine Antwort bearbeitet. Sie können 'count (a.order + 1)' verwenden –

0

Gelöst verwenden. Wenn Sie dies markieren, markieren Sie diese Frage als beantwortet.

Verwandte Themen