2016-04-09 6 views

Antwort

2

der einfachste Weg, in MySQL Wahrscheinlich ist eine Sicht zu definieren, die in die Berechnung:

create view v_t as 
    select t.*, (affinity*weight*decay) as rank 
    from t; 

Anschließend können Sie die Ansicht statt der Tabelle in Ihrem Code verwenden, und der Wert wird da sein.

+0

was meinst du Ansicht? ansicht in mvc? oder etwas in MySQL? –

+0

Kommt drauf an. Wenn Sie MySQL 5.7.6+ verwenden, dann gibt es auch GENERATED COLUMNS, was in diesem Fall einfacher sein könnte. Sie sind ziemlich neu, denke ich, und ich habe nur zufällig von ihnen gehört ;-) – PerlDuck

+0

@sadbeginner Gordon bedeutet eine [MySQL VIEW] (http://dev.mysql.com/doc/refman/5.7/en/create- view.html). Sie können sich das als eine vordefinierte SELECT-Anweisung vorstellen, die in der Datenbank gespeichert ist und wie eine Tabelle verwendet werden kann, solange Sie nur _auswählen. Es gibt auch VIEWS, in die eingefügt werden kann, aber dann wird es kompliziert. Mit Gordons Ansicht können Sie z.B. 'Wählen Sie * aus v_t' oder' wählen Sie user_id aus v_t mit Rang = 15'. – PerlDuck

0

Die Berechnung Sie präsentieren ein intrinsisches Problem (wahrscheinlich oder zumindest das ist mein Verständnis), weil durch unterschiedliche Werte haben für die affinity, weight und decay Sie mit dem gleichen Ergebnis am Ende können zum Beispiel 3 X 4 X 5 = 5 X 3 X 4. Wenn Sie also versuchen, Datensätze zu finden, deren Rang beispielsweise 60 ist, erhalten Sie mindestens zwei (anhand des obigen Beispiels). Suchst du danach? Wenn nicht, würde es viel klarer scheinen, einen zusammengesetzten Rang zu erzeugen, etwas wie entspricht dem affinity (Bereich 000-999), und so weiter. Und dennoch wird die Ansicht Lösung, die oben vorgeschlagen wird, nicht empfohlen, da es Berechnungen bei jeder Abfrage auslösen würde.

Eine andere Alternative wäre das Setzen von Triggern für diese drei Felder, sodass, wenn sich der Wert eines der Felder ändert, das Rangfeld neu berechnet und in der entsprechenden Spalte bereitgestellt wird.

+0

Wie setze ich die Trigger? –

+0

Überprüfen Sie diese [link] (http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html). Die Idee wäre, eine ** Rank ** -Spalte zur Tabelle hinzuzufügen und Trigger für jedes der drei Felder zu setzen, die zur Berechnung des Rangs verwendet werden, so dass immer dann, wenn ein Wert für eines der Felder definiert/geändert wird, eine Berechnung durchgeführt wird Ort und der daraus resultierende Rangwert in der neuen Spalte. SORGFÄLTIG, EINEN TRIGGER NICHT IN DAS NEUE FELD EINZUSTELLEN !!! – FDavidov

3

Wenn Sie mit MySQL 5.7.6, dann könnten Sie auch GENERATED COLUMNS

aus der Nutzung docs (Sie den Abschnitt nach unten scrollen müssen "CREATE TABLE und generierten Spalten"):

Wie von MySQL 5.7.6 unterstützt CREATE TABLE die Spezifikation von generierten Spalten.

Generierte Spalten entweder

  • virtuelle sein kann, das heißtberechnet on the fly, wenn die Spalte gelesen wird, ähnlich eine Ansicht wie @GordonLinoff vorgeschlagen

oder

  • gespeichert, dh sie Platz im DB besetzen und jedes Mal berechnet bekommen die Reihen

Beispiel eingefügt oder aktualisiert:

-- calculated on-the-fly when reading: 
create table post (
    id  int, 
    user_id varchar(20), 
    affinity int, 
    weight int, 
    decay int, 
    RANK  int GENERATED ALWAYS AS (affinity*weight*decay) VIRTUAL 
); 

oder

-- calculated during insert/update: 
create table post (
    id  int, 
    user_id varchar(20), 
    affinity int, 
    weight int, 
    decay int, 
    RANK  int GENERATED ALWAYS AS (affinity*weight*decay) STORED 
); 
Verwandte Themen