Ich habe ein Problem ähnlich LIMITing a SQL JOIN, aber mit einer etwas komplexeren Anforderung.LIMITIEREN eines SQL-JOIN, mit JOIN-Bedingungen
Ich möchte für Benutzer und die damit verbundenen Transaktionen suchen, die innerhalb eines Zeitbereichs liegen:
SELECT u.*, t.*
FROM User u
JOIN Transaction t ON t.user_id = u.id
WHERE t.timestamp >= ? and t.timestamp <= ?;
So weit, so gut. Jetzt möchte ich die Abfrage wiederholen, aber mit einem LIMIT auf die Anzahl der zurückgegebenen Benutzer. Die Anzahl der für einen bestimmten Benutzer zurückgegebenen Transaktionen sollte jedoch nicht begrenzt sein.
Wenn ich den Ansatz vorgeschlagen, in der anderen Frage folgen, würde dies übersetzen in:
SELECT u.*, t.*
FROM (SELECT * FROM User LIMIT 10) u
JOIN Transaction t ON t.user_id = u.id
WHERE t.timestamp >= ? and t.timestamp <= ?;
Dies wird nicht produzieren, was ich will: es werden die ersten 10 Benutzer zurückgeben, die keine Transaktionen haben könnten assoziiert .
Ich möchte 10 Benutzer , die mindestens eine verknüpfte Transaktion in dem angegebenen Zeitraum haben.
Wie kann ich dies mit MySQL erreichen?
Danke, das funktioniert in der Tat, außer einer fehlenden schließenden Klammer am Ende des zweiten 'IF()'. Gibt es eine Auswirkung auf die Leistung der beiden Subselects? – Benjamin
Außerdem denke ich, dass MySQL das komplette Ergebnis (alle Zeilen) des ursprünglichen JOIN (wahrscheinlich in einer temporären Tabelle?) Lesen muss, bevor es nur die ersten zurückgibt, während das Programm ausgeführt wird äußere SELECT. Kann dies nicht ein großer Leistungsengpass sein, wenn Sie viele Benutzer haben und nur wenige von ihnen übereinstimmende Transaktionen haben? – Benjamin
@Benjamin Sie können alle vorgeschlagenen Abfragen mit Ihren tatsächlichen Daten testen und uns sagen, wie sie miteinander verglichen werden. –