AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken [SQL] Order-Feld automatisch ausfüllen lassen

[SQL] Order-Feld automatisch ausfüllen lassen

Ein Thema von Valle · begonnen am 4. Mai 2012 · letzter Beitrag vom 4. Mai 2012
Antwort Antwort
Benutzerbild von Valle
Valle
Online

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.073 Beiträge
 
#1

[SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 11:53
Datenbank: MySQL / SQLite • Version: N/A • Zugriff über: N/A
Hallo DPler!

Ich hab' mal wieder eine Frage, ob etwas sinnvoll nur mit SQL umsetzbar ist.

Ich habe eine Tabelle mit den Feldern Name und Order. Bei jeder Abfrage wird die Reihenfolge der Einträge über das Feld Order bestimmt (ORDER BY `order`). Manchmal kommt es aber vor, dass die Einträge dieser Tabelle völlig durcheinander sind und die Reihenfolge automatisch neu bestimmt werden kann. In diesem Fall ist die Abfrage über ORDER BY `name` richtig. Da die Abfragen aber nicht allesamt geändert werden können, muss das der Inhalt des Order-Feld neu gesetzt werden. Folgender Code tut dies:

Code:
result = connection.execute("SELECT id FROM tabelle ORDER BY name")
order = 1
for row in result:
    connection.execute("UPDATE tabelle SET `order` = %i WHERE id = %i" % (order, row['id']))
    order += 1
Gibt es einen sinnvollen Code, der dies auf dem Server ausführt? Das ganze muss unter MySQL & SQLite laufen.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.469 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 12:12
da es vermutlich keine CURSOR oder Temporärtabellen mit (identity) unter MySQL gibts, keine Ahnung ob das unter MySQL geht, der SQL-Server verdaut es
Code:
update Tabelle set [order]=(Select Count(*) from (Select distinct top 10000000  [name] from tabelle order by [name] ) a where tabelle.[name] > a.[name]) + 1
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#3

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 13:19
Sehr schöne Idee. Geht es einfacher?
Code:
update Tabelle
  set [order]=(
            Select Count(*)
              from tabelle x
             where x.[name] > Tabelle.[name]
             order by [name]
       )
(Ungetestet)
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle
Online

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.073 Beiträge
 
#4

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 13:27
Ah, der Vergleich auf Größe zweier Varchars ist der Trick. Folgender Code tut seinen Zweck:

Code:
UPDATE `tabelle` SET `order` = (SELECT count(*) FROM (SELECT DISTINCT `name` FROM `tabelle` ORDER BY `name`) a WHERE `tabelle`.`name` > a.`name`);
Die "TOP 1000000" habe ich in ihrer Wirkung nicht wirklich verstanden. MySQL unterstützt die Syntax ohnehin nicht. Vermutlich ist es eine LIMIT Anweisung? Das "+ 1" am Ende macht das Query kompatibel zu meinem obigen Code, allerdings ist es für die Reihenfolge natürlich völlig unerheblich, ob man bei 0 oder 1 beginnt.

Vielen Dank!

@Iwo Asnet: ERROR 1093 (HY000): You can't specify target table 'tabelle' for update in FROM clause

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog

Geändert von Valle ( 4. Mai 2012 um 13:32 Uhr) Grund: Kein SQL Highlighter mehr?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 16:04
Ich habe eine Tabelle mit den Feldern Name und Order
1. Gebot der Datenbankprogrammierung
Du sollst in deinen Feld- und Tabellennamen keine reservierten Namen verwenden.
In Pascal/Delphi schreibst du ja auch nicht:
Delphi-Quellcode:
var
   False, True : Integer; // Ja, der Compiler übersetzt das
begin
   for False := 1 to 10 do
      True := False;
end;
Man kann die Namen quoten, aber das Problem lauert auf dich und taucht dann auf, wenn du es überhaupt nicht brauchen kannst.
Andreas
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 16:53
Also in MSSQL geht das hier:
Code:
update tabelle set rank = (select count(*) from tabelle x where x.Name<tabelle.name)
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle
Online

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.073 Beiträge
 
#7

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 18:16
Du sollst in deinen Feld- und Tabellennamen keine reservierten Namen verwenden.
Das Feld heißt weder wirklich order noch heißt die Tabelle tatsächlich tabelle.

In Pascal/Delphi schreibst du ja auch nicht:
Ich schreibe in Delphi / Pascal generell nicht.

Man kann die Namen quoten, aber das Problem lauert auf dich und taucht dann auf, wenn du es überhaupt nicht brauchen kannst.
Wir haben das bei einem recht umfangreichen Softwareprojekt in der Firma tatsächlich ein Mal gemacht. Bisher hatte ich nie Probleme damit, da unser ORM damit bestens klar kommt. Dennoch mache ich sowas, allein schon aus Gründen der Bequemlichkeit, nicht. In diesem Fall sollte nur klar gemacht werden, was die Spalte tut. Reihenfolge war mir für meine Tests zu lang.

@Furtbichler: Danke, aber das ist die gleiche Lösung wie die von Iwo Asnet. Entsprechend habe ich auch die selbe Fehlermeldung.

Es gibt noch ein kleines Manko an der Geschichte: Kommt der Inhalt der Name-Spalte mehrmals vor, erhalten logischerweise all diese Namen den gleichen Wert für Order. Das ist theoretisch nicht so schlimm, da hier automatisch sowieso keine Reihenfolge gefunden werden kann. Und theoretisch kommt das in diesem Fall auch nicht vor. Aber eigentlich ist das nicht besonders schön. Ich weiß auch nicht, was die Software, die diese Datenbank auswertet davon hält.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
969 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 22:17
MySql hat dieses schöne Variabeln Konstrukt, damit kann man sowas wie rownum generieren:

Code:
   
UPDATE tabelle u,
       (SELECT @rownum := @rownum + 1 ROWNUM,
               id
        FROM  (SELECT @rownum := 0) r,
               (SELECT id,
                       name
                FROM  tabelle
                ORDER BY Name) s) x
SET   u.ordnung = x.rownum
WHERE u.id = x.id
funktioniert nicht für ID mehrfach oder null

in sqlite gibts wohl nur rowid, vielleicht kann man das ähnlich einsetzen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.469 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: [SQL] Order-Feld automatisch ausfüllen lassen

  Alt 4. Mai 2012, 22:48
Zitat:
Die "TOP 1000000" habe ich in ihrer Wirkung nicht wirklich verstanden
MSSQL hat ein Problem mit Order by in Subquerys, mit TOP xxx lässt es sich dazu überreden...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf