2016-06-11 7 views
2

Ich versuche, die letzte Übereinstimmung in Spalte "mehr" von Ergebnis VG1 zu erhalten.Zählergebnis in Zeile nicht übereinstimmen

In diesem Fall zählt meine Abfrage alle Ergebnisse in der Spalte, aber ich muss nur zählen, bevor es geändert wird. Wenn es VG1, VG1, VG2, VG1 ist, brauche ich Ergebnis 2, nicht 3 (alle).

Abfrage:

SELECT home, count(*) as count 
from results 
where more='VG2' and home='pero' 
group by home 
order by count(more) desc 

MYSQL schema:

CREATE TABLE results 
    (`datum` longtext, `home` longtext, `away` longtext, `more` longtext) 
; 

INSERT INTO results VALUES  ('14.05.2016 ', 'pero', 'miha', 'VG1'); 
INSERT INTO results VALUES  ('11.04.2016 ', 'pero', 'milan', 'VG1'); 
INSERT INTO results VALUES  ('10.03.2016 ', 'pero', 'semenka', 'VG2'); 
INSERT INTO results VALUES  ('24.02.2016 ', 'pero', 'torta', 'VG1'); 
INSERT INTO results VALUES  ('14.01.2016 ', 'pero', 'miha3', 'VG2'); 
INSERT INTO results VALUES  ('10.01.2016 ', 'pero', 'simens', 'VG2'); 
+0

Haben Sie PK in der Tabelle? – Shaharyar

+0

Nr. Ich kann ID hinzufügen, aber ich einige Daten aus Text und seine nicht gut sortiert, so ist es nicht gültig Ergebnis. – user3307783

+0

Ich bin verwirrt. Ihre Frage beginnt mit der Frage nach Ergebnissen von VG1. Ihre Abfrage verwendet VG2. Beide sqlfiddle-Ergebnisse zeigen 3 nicht 4 – dbmitch

Antwort

1

Sie Variablen für diese verwenden:

select home, more, count(*) as count 
from  (select *, 
        @set := if(@home <> home, '', @set), 
        @home := home, 
        not find_in_set(more, @set) as is_first, 
        @set := if (@more <> '' and @more <> more, 
           concat(@set, @more, ','), 
           @set), 
        @more := more 
      from  results, 
        (select @set:='', @prev:='', @home='') init 
      order by home, datum desc) base 
where is_first 
group by home, more 
order by count(*) desc 

Ausgang:

| home | more | count | 
|------|------|-------| 
| pero | VG1 |  2 | 
| pero | VG2 |  1 | 

Siehe fiddle

Die is_first Spalt von der inneren Abfrage zeigt an, ob ein Datensatz in der ersten Reihe von more Werten pro home gehört. Dies wird als Bedingung in die äußere Abfrage eingefügt, sodass die Funktion count das erforderliche Ergebnis zurückgibt.

Wenn Sie nur das Ergebnis für einen bestimmten home und more Wert benötigen, dann fügen Sie das in einer where Klausel in der äußeren Abfrage hinzu.

+0

Das hilft mir sehr, aber ich mache mir Sorgen über meine Website, wenn ich eine Menge dieser Fragen habe, wird es ihn verlangsamen? – user3307783

+0

Diese Abfrage wird nicht so schnell wie eine Abfrage ausgeführt, die keine Unterabfrage benötigt. Wenn Sie also die Leistung optimieren möchten, würde ich vorschlagen, dass Sie Ihre Tabelle mit einem zusätzlichen 'is_first'-Flag erweitern, das Sie mit einer Funktion aktualisieren sollten. Es kostet Sie leichte Leistung bei Updates, aber geben Sie einen leichten Schub bei Abfragen. – trincot

Verwandte Themen