2016-03-22 10 views
1

A) Benutzermysql leftjoin von max autoincrement id?

B) Abo

C) Paketinformationen

Ich habe Tisch, an dem eine Verbindung zwischen BA und C ist, die Abfrage ausgewählt von A, wobei B Zeilen-ID fürhatund treten Sie C von B ID.


Voll Beispiel:

SELECT a.*,c.packageTitle 
FROM users AS a 
LEFT JOIN subscribe AS b ON (b.userid = a.userid) 
LEFT JOIN package AS c ON (b.packageid = c.packageid) 

mein Problem, wenn der Benutzer Multi-Abonnement in C hat, kann ich nicht letzte Abonnementreihe in Schleife Abfrage erhalten, habe ich auch MAX(c.packageid) innen SELECT auch gescheitert.


Tor: neuesten Rekord in B von A-ID zugewiesen bekommen.

eine Beratung sehr viel

geschätzt

Antwort

0

Ich glaube nicht, dass Sie weit weg waren durch die Verwendung MAX() versuchen, den Datensatz mit dem neuesten Paket-ID zu erhalten (die davon ausgeht, dass diese ID ist ein zunehmender auto- Spalte erhöhen). In meiner Antwort unten identifiziert die Unterabfrage die letzte Paket-ID für jeden Benutzerdatensatz unter Verwendung einer GROUP BY. Diese Unterabfrage wird dann verwendet, um die korrekten Datensätze aus Ihrer ursprünglichen Abfrage zu filtern.

SELECT a.userid, b.* 
FROM users AS a 
LEFT JOIN subscribe AS b 
    ON b.userid = a.userid 
LEFT JOIN package AS c 
    ON b.packageid = c.packageid 
INNER JOIN 
(
    SELECT a.userid, MAX(c.packageTitle) AS maxPackageTitle 
    FROM users AS a 
    LEFT JOIN subscribe AS b 
     ON b.userid = a.userid 
    LEFT JOIN package AS c 
     ON b.packageid = c.packageid 
    GROUP BY a.userid 
) t 
    ON a.userid = t.userid AND c.packageTitle = t.maxPackageTitle 

Als Hinweis, diese Abfrage von etwas stark profitieren würde so genannten Common Table Expression (CTE), die als SQL-Server und Oracle in anderen RBDMS solche verfügbar ist. Ein CTE würde die Abfrage viel weniger wiederholend und lesbarer machen.

+0

plz denke, ich habe über 100K Datensätze ist diese Abfrage sicher auf Server-Speicher? – Jack

+0

Welche Alternative haben Sie, die eine bessere Leistung haben wird? Wie auch immer, dies ist nur eine Verknüpfung Ihrer 100K-Tabelle zu einer vereinfachten Version von sich selbst. Wenn Ihr Server dies nicht kann, sollte es nicht in Produktion sein. –

0

Dies sollte einfach genug sein. In Mysql stellst du genau wie du gesagt hast ein Maximum auf das select zusammen mit einer Gruppe von. So wäre es etwa so aussehen:

SELECT username, id_info, ... 
FROM 
(
    SELECT a.username, a.id_info, c.packageTitle, MAX(package_id) 
    FROM users AS a 
    LEFT JOIN subscribe AS b 
     ON b.userid = a.userid 
    LEFT JOIN package AS c 
     ON b.packageid = c.packageid 
    GROUP BY a.username, a.id_info, c.packageTitle 
) 

Denken Sie daran, alle Spalten in der Auswahlliste auf, die auch gruppiert werden, mit Ausnahme des auf den Sie den max einnehmen, oder die Abfrage fehl.

+0

plz denke, ich habe über 100K Datensätze ist diese Abfrage sicher auf dem Server-Speicher? – Jack