2016-08-08 90 views
0

Ich möchte alle Zeilen aus einer Tabelle auswählen, die 50 häufigste Werte der Spalte enthalten. Ich habe versucht, einen solchen Join zu verwenden, aber es scheint, dass ich LEFT JOIN falsch gewählt habe. Der innere Teil der Aussage scheint in Ordnung zu sein. Was soll ich in meiner Aussage ändern?Wählen Sie Zeilen mit den häufigsten Werten einer Spalte. MySQL

SELECT col1, col2 
FROM tbl as t1 
LEFT JOIN (
    SELECT id 
    FROM tbl 
    WHERE id > 123 
     AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) AS t2 
ON t1.id = t2.id 
+0

Was mit Ihrer Anfrage falsch ist? Hast du versucht, es stattdessen in einen "inneren Join" zu verwandeln? – sgeddes

+0

Innerer Join gibt nur 50 Zeilen zurück. Das Seltsame ist, wenn ich das Limit innerhalb der inneren Auswahl auf 5 änderte, änderte sich die Anzahl der zurückgegebenen Zeilen nicht. – pedmillon

+0

Wenn Sie den 'linken Join' verwenden, würden die Ergebnisse gleich sein, einige hätten nur eine 'Null'-ID von' t2' (wenn Sie das angezeigt hätten). Vielleicht würden Beispieldaten und erwartete Ergebnisse helfen ... – sgeddes

Antwort

0

Anstatt ein JOIN, haben Sie versucht, einen IN-Operator als Teil Ihrer WHERE-Klausel zu verwenden?

Zum Beispiel ...

SELECT col1, col2 
FROM tbl as t1 
WHERE t1.id IN (
    SELECT id 
    FROM tbl 
    WHERE id > 123 
     AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) 
+0

Aus irgendeinem Grund kann ich LIMIT nicht innerhalb der IN-Klausel verwenden – pedmillon

0

Rechts beitreten sollte, wenn Ihre Unterabfrage korrekt ist, keine passenden Zeilen von t1 bis t2 Rückkehr (im Gegensatz zu allen Reihen von t1 und den dazu passenden T2 ist oder NULL-Werte gegen):

SELECT col1, col2 
FROM tbl as t1 
RIGHT JOIN (
    SELECT id 
    FROM tbl 
    WHERE id > 123 
     AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) AS t2 
ON t1.id = t2.id 
0

ich weiß, meine Frage war OK, ich wollte nur auf col1 beizutreten, nicht id :)

SELECT col1, col2 
FROM tbl as t1 
LEFT JOIN (
    SELECT col1 
    FROM tbl 
    WHERE id > 123 
    AND id < 987654 
    GROUP BY col1 
    ORDER BY COUNT(id) DESC 
    LIMIT 50 
) AS t2 
ON t1.col1 = t2.col1