MySQL effiziente Iteration mit MYSQL

Bazilinho

Mitglied
Hi Leute!
Ich hoffe, Ihr könnte mir bei folgendem Problem helfen..

Ich habe eine MYSQL-Datenbank und hier in einer Tabelle Datensätze, die mit einem Rang versehen sind. Also der billigste Anbieter der Dienstleistung ist auf 1, der nächste auf 2 usw...

Jedoch gibt es hierbei noch 1 Unterscheidungsmerkmal (1 oder 0). Mich interessieren nur die Datensätze, bei denen das Merkmal x=0 ist.

Ich hoffe, Ihr könnt mir soweit folgen.. 😳

Es kann also sein, dass der billigste Anbieter (mit x=0) im Ranking mal auf 1, aber auch mal auf 3, 4, 5 usw. steht.

Ein Szenario wäre also:

Datensatz x mit Rang 1 wird auf den bereinigten Rang 1 abgebildet,
Datensatz y mit Rang 3 wird auf den bereinigten Rang 2 abgebildet,
Datensatz y mit Rang 5 wird auf den bereinigten Rang 3 abgebildet,
....


Ich habe meiner Tabelle auch schon eine Spalte für dieses "bereinigte" Ranking hinzugefügt.
HIer sind aber noch die Default-Werte (NULL) eingetragen.

ABER: Wie kann ich das bereinigte Ranking jetzt effizient erstellen?? Mit 2 Selects (die ich sonst DEFINITIV bräuchte ) und for-Schleifen, die dann das UPDATE beinhalten aus der JAVA-Applikation heraus erscheint mir doch recht uneffizient..

Sry, aber ich muss mich leider an manchen Stellen etwas schwammig ausdrücken.. Darum glaubt mir bitte einfach, dass ich sonst 2 Selects bräuchte...

Vielen Dank schonmal für Euren Support!!
 
schwammig ausgedrückt, in der Tat,
da du anscheinend nicht von selber schon an einer zweiten Version arbeitest, meine Aufforderung dazu 😉

ein besonders unklarer Punkt
- "Merkmal x=0 ist" .. "Datensatz x"
dass du x mal als Merkmal verwendest, dann aber einer der Datensätze auch mit x bezeichnest, ist ungünstig,

in deinem Beispiel taucht das Merkmal x bzw. sonst irgendwas, was nur 0 oder 1 sein kann, auch nicht auf,
das ist schlecht, so weiß man gar nicht was x nun zu bedeuten hat,
evtl. muss man das Update nur für bestimmte Einträge aus der DB machen, das wäre doch trivial

------

soweit ich es insgesamt verstehe könnte das ganze so lauten:

[sql]
update tabelleA a1 set bRang =
(select count(*) from tabelleA a2
where a1.id != a2.id and sonstige wichtige Bedingungen zur Zuordnung zu a1
and x = 0 and a2.rang < a1.rang) +1
where x = 0
[/sql]
zählen wie viele andere es gibt +1
 
Ok, Du hast Recht, mit dem X als Merkmal und Datensatz...
Hat wirklich nix miteinander zu tun!!!

Ok, aber Step by Step..
Ja, ich arbeite grade an der JAVA-basierten Version, steht auch kurz vor der Vollendung...

Werde aber auch Deinen SQL-Befehl mal austesten.

Ich versuche nochmal mein Problem zu erläutern..

Meine Spalten in der DB sehen in etwa so aus:


Code:
Merkmal 1 | Postleitzahl | ... | Mermal 2 (0 oder 1) | Rang (komplett) | Rang (mit Merkmal 2 = 0) |
--------------------------------------------------------------------------
.....         |  50222       | ... |              0            |     1                 |      1
.....         |  50222       | ... |              1            |     2                 |      -
.....         |  50222       | ... |              0            |     3                 |      2
.....         |  50222       | ... |              1            |     4                 |      -
.....         |  50222       | ... |              0            |     5                 |      3


....


.....         |  50223       | ... |               0           |     1                 |      1
.....         |  50223       | ... |               1           |     2                 |      2

.....

So sieht es aus.. Den kompletten Ränge pro PLZ und so habe ich.. Ich muss jetzt eben nur die bereinigten Ränge berechnen, anhand der Tatsache das Merkmal 2 = 0 ist..

Ich hoffe, das machts deutlicher.. :rtfm:
 
Zuletzt bearbeitet von einem Moderator:
An sich recht einfach zu lösen.

Jedesmal wenn du das Ranking aktualisieren willst, holst du dir die Datensätze deren Merkmal 0 ist.
Code:
Select * from ranks where merkmal = 0 order by rank

Da du das Ranking neu vergeben willst bietet sich eine Hilfstabelle sehr an in die du die Daten überträgst. Diese sollte eine zusätzliche Spalte mit einer Auto ID für das neue Ranking haben.
Code:
insert into ranks_neu select * from ranks where merkmal = 0 order by rank

Abschließend kannst du deine alte Ranking Tabelle leeren und die Daten der Hilfstabelle in selbige übertragen.

An sich eine ideale Aufgabe für einen Cronjob 😉
 

Zurück
Oben