2017-02-01 1 views
0

Hier ist meine Frage:Wie kann ich alternativ Top Ten bekommen?

SELECT 
    pr1.id AS user_id, 
    pr1.title AS user_name, 
    pr2.id AS liker_id, 
    pr2.title AS liker_name, 
    x.which AS which_table, 
    x.cnt AS total, 
    x.rank AS rk 
FROM 
(
    SELECT rid, rootid, which, COUNT(*) AS cnt, rank 
    FROM 
    (
    SELECT @rank1 := @rank1 + 3 rank, rid, rootid, 'vote' which 
    FROM p_likes, (select @rank1 := -2) q 
    UNION ALL 
    SELECT @rank2 := @rank2 + 3 rank, rid, rootid, 'comment' which 
    FROM p_comments, (select @rank2 := -1) q 
    UNION ALL 
    SELECT @rank3 := @rank3 + 3 rank, rid, rootid, 'friend' which 
    FROM relations, (select @rank3 := 0) q 
) y 
    WHERE y.rootid = 1246 AND y.rootid <> y.rid 
    GROUP BY y.rid, y.rootid, y.which 
) x 
INNER JOIN pagesroot pr1 on x.rootid = pr1.id 
INNER JOIN pagesroot pr2 on x.rid = pr2.id 
ORDER BY x.rank desc, x.cnt desc, x.which 
LIMIT 30; 

Meine Frage ist über die Bestellung. Ich möchte 10 Zeilen (wenn vorhanden) jede Tabelle bilden. Es gibt 3 Tabellen (p_likes, p_comments, relations). Das Ergebnis sollte also maximal 30 Zeilen umfassen.

Aber was ist meine Frage: Ich muss alternativ bestellen. Ich meine erste Reihe von p_likes sein soll, zweite von p_comments sollte dritte von relations sollte vierte von p_likes und so weiter sein sollte ..

Ich möchte auch sie auf der cnt Spalte sortieren basierend zuerst . Ich meine, ich will Top-Ten von jedem Tisch.

Wie kann ich das tun?

+1

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

+0

@Strawberry Ist meine Frage nicht klar für Sie? – stack

+0

Beziehen Sie sich auf die angenommene Antwort verbunden – Strawberry

Antwort

1

sollten Sie Nummer hinzufügen, wie Sie erhalten möchten und geben erster Ordnung durch sie wie unten als num

SELECT @rank1 := @rank1 + 3 rank, rid, rootid, 'vote',1 as num which 
FROM p_likes, (select @rank1 := -2) q group by y.rid, y.rootid limit 1,10 
UNION ALL 
SELECT @rank2 := @rank2 + 3 rank, rid, rootid, 'comment',2 as num which 
FROM p_comments, (select @rank2 := -1) q y.rid, y.rootid limit 1,10 
UNION ALL 
SELECT @rank3 := @rank3 + 3 rank, rid, rootid, 'friend',3 as num which 
FROM relations, (select @rank3 := 0) q y.rid, y.rootid limit 1,10 
+0

Ihre Anfrage ist nicht was ich suche, danke trotzdem. Ich denke, meine Frage ist nicht klar genug – stack

+0

@stack benötigen Sie 10 Zeilen pro Tabelle? –

+0

ja. 10 Zeilen pro Tabelle, und 10 Zeilen sollten diejenigen sein, die größte 'cnt' haben – stack

1

Sie Gruppierung von rid, rootid, which. Sie wählen rid, rootid, which, COUNT(*) AS cnt, rank. So erhalten Sie dierid, dierootid, diewhich und die Anzahl der Datensätze pro rid, rootid, which. Aber welche von allen Rängen pro rid, rootid, which glaubst du, du bekommst? Wenn es die Ränge 3, 6, 9 für die rid, rootid, which gibt, welche wird das DBMS auswählen? Sie sagen es nicht (was Sie mit MIN oder MAX tun könnten), also wählt das DBMS einen Rang willkürlich aus. Sie sehen, Ihre Vorgehensweise kann nicht funktionieren.

In den Kommentaren sagen Sie, Sie wollen die 10 Datensätze pro Tabelle mit der höchsten Anzahl (per rid für rootid 1246 offensichtlich). Sie müssen also rootid = 1246 and rootid <> rid für jede Tabelle anwenden und direkt zählen. Verwenden Sie dann LIMIT, um nur bis zu zehn Datensätze pro Tabelle aufzunehmen.

SELECT 
    pr1.id AS user_id, 
    pr1.title AS user_name, 
    pr2.id AS liker_id, 
    pr2.title AS liker_name, 
    x.which AS which_table, 
    x.cnt AS total 
FROM 
(
    (
    SELECT rid, rootid, 'vote' AS which, COUNT(*) AS cnt 
    FROM p_likes 
    WHERE rootid = 1246 and rootid <> rid 
    ORDER BY COUNT(*) DESC 
    LIMIT 10 
) 
    union all 
    (
    SELECT rid, rootid, 'comment' AS which, COUNT(*) AS cnt 
    FROM p_comments 
    WHERE rootid = 1246 and rootid <> rid 
    ORDER BY COUNT(*) DESC 
    LIMIT 10 
) 
    union all 
    (
    SELECT rid, rootid, 'friend' AS which, COUNT(*) AS cnt 
    FROM relations 
    WHERE rootid = 1246 and rootid <> rid 
    ORDER BY COUNT(*) DESC 
    LIMIT 10 
) 
) x 
INNER JOIN pagesroot pr1 ON x.rootid = pr1.id 
INNER JOIN pagesroot pr2 ON x.rid = pr2.id 
ORDER BY x.cnt DESC, x.which; 
+0

Als Sie ..aber Ihre Abfrage gibt nur 3 Zeilen zurück: https://i.stack.imgur.com/zL1xH.png – stack

+0

Bitte lesen Sie [diese] (http://stackoverflow.com/questions/41974970/how-can-i-order- ausgewählte-rows-alternativ). es ist meine gleiche Frage, indem ich den anderen Weg erkläre. – stack

+0

Also fehlen Zeilen? Hat der Benutzer 1246 mehr Freunde oder mehr Kommentatoren oder mehr Likers, die nicht in den Ergebnissen erscheinen? –

Verwandte Themen