2016-05-27 2 views
0

ich ein paar Spieler Aufzeichnungen haben, eine Reihe von Weltrekorden, und eine Reihe von gesperrten Spielern:Auswahl Mindestzeit für jede einzelne Spalte Wert in dem Benutzer nicht verboten ist

describe records

+--------+---------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+--------+---------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| type | varchar(3) | NO | MUL | NULL |    | 
| map | varchar(31) | NO | MUL | NULL |    | 
| authid | varchar(31) | NO |  | NULL |    | 
| time | decimal(13,6) | NO |  | NULL |    | 
| date | datetime  | NO |  | NULL |    | 
+--------+---------------+------+-----+---------+----------------+ 

describe wrs

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| map   | varchar(31) | NO | MUL | NULL |    | 
| route  | varchar(31) | NO |  | NULL |    | 
| time  | decimal(5,2) | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

describe banned

+--------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+--------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| authid | varchar(31) | NO | UNI | NULL |    | 
+--------+-------------+------+-----+---------+----------------+ 

Ich versuche, das Minimum time von der records Tabelle für jede einzelne map wo authid (Spieler-ID) zu wählen ist in der banned Tabelle nicht gefunden.

Ich möchte auch den Weltrekord time von wrs für die gleiche map abrufen.

Ich mag map auszuwählen, authid und time von records nur, wenn type „pro“ ist gleich, aber möchte map aus der Liste der einzigartigen Karten halten und time aus der entsprechenden Zeile in wrs wenn die type nicht gleich "Profi".

Mein Problem ist das Abrufen der korrekten/authid aus der records Tabelle entspricht, wenn die minimale time/map abruft. Ich habe es geschafft, so etwas zu tun:

SELECT m.map, minTime, wrTime, wrTime/minTime AS ratio, minTime - wrTime AS diffTime FROM 
    # get all unique maps from records table 
    (SELECT map FROM records GROUP BY map) AS m 
     LEFT JOIN 
    # find min time for each map where type is pro 
    (SELECT type, map, MIN(time) AS minTime FROM records WHERE type = "pro" GROUP BY map) AS p 
     ON m.map = p.map 
     LEFT JOIN 
    # find world record time for each map 
    (SELECT map, MIN(time) AS wrTime FROM wrs GROUP BY map) AS w 
     ON m.map = w.map 

aber nicht für verboten Spieler-Konto, weil ich nicht die richtigen authid Werte abrufen können, wenn die minimale time Auswahl (beiseite: Ich bin nicht einmal sicher, die richtige type würde in der WHERE-Klausel verwendet werden). Ich könnte leicht so etwas wie die folgende zu der Abfrage hinzufügen verboten Spieler zu ignorieren, wenn ich die richtige authid hatte:

SELECT * FROM records r LEFT JOIN banned b ON r.authid = b.authid WHERE b.authid IS NULL 

Hoffentlich habe ich Sinn habe. Wenn nicht, bitte fragen Sie nach weiteren Informationen.

+1

Können Sie Beispieldaten und erwartete Ergebnisse liefern? Wenn Sie es bei [sqlfiddle] (http://sqlfiddle.com) tun könnten, wäre das großartig. –

Antwort

1

Ich bin nicht sicher, dass ich das Problem vollständig verstanden, aber ich denke, die folgenden SQL Ihnen helfen kann:

Mein Problem den richtigen/entsprechenden authid aus den Aufzeichnungen Tabelle abruft, wenn die Minimalzeit Abrufen /Karte. "

SELECT 
    map, 
    MIN(time) AS minTime 
FROM records 
WHERE 
    authid NOT IN (SELECT authId FROM banned) 
GROUP BY map 
+2

Danke, Felix, um meinen schlecht formatierten Post neu zu formatieren. – Piyg

0

die Sie interessieren, hoffe ich nicht Ihre intendance verwechseln.

SELECT 
    m.map, 
    m.minTime, 
    w.wrTime, 
    w.wrTime/m.minTime AS ratio, 
    m.minTime - w.wrTime AS diffTime 
FROM 
    records r 
    INNER JOIN 
    -- get all unique maps from records table 
    (SELECT map, MIN(time) AS minTime FROM records WHERE type = "pro" GROUP BY map) m ON r.map = m.map AND r.time = m.minTime 
    LEFT JOIN 
    -- find world record time for each map 
    (SELECT map, MIN(time) AS wrTime FROM wrs GROUP BY map) w ON m.map = w.map 
    LEFT JOIN banned b ON r.authid = b.authid 
WHERE b.authid IS NULL 
+0

Ich glaube, das zählt keine Zeile, wenn die Mindestzeit von einem gesperrten Spieler kommt. – tenub

0

Für Interessenten, das ist, wie ich mein Problem schließlich lösen (mit Hilfe von Piyg Antwort) :

+0

froh, dass meine Antwort helfen könnte. – Piyg

Verwandte Themen