2017-02-14 7 views
0

Ich habe ein bisschen kompliziert query:Verwenden von Zeilen aus der ersten Abfrage in der Unterabfrage?

SELECT SQL_CALC_FOUND_ROWS DISTINCT l1.item_id, l1.uid, l2.id, l2.uid, u.prename, l1.item_id, l2.item_id, 
    (SELECT SUM(cnt) FROM 
    (
    SELECT DISTINCT 
     p1.item_id, 
     COUNT(*) AS cnt 
    FROM pages_likes AS p1 
     JOIN pages_likes AS p2 ON p1.item_id = p2.item_id AND p1.status = p2.status 
    WHERE p1.uid = 391 AND p2.uid = 1091 
    GROUP BY p1.id 
    ORDER BY p1.date DESC 
) AS t) AS total 

FROM pages_likes l1 
    JOIN users u on u.id = l1.uid 
    JOIN pages_likes l2 on l1.item_id = l2.item_id 
    JOIN users_likes ul on l1.uid = ul.uid 
WHERE ul.date >= DATE_SUB(NOW(),INTERVAL 1 WEEK) 
     AND l1.uid != 1091 AND l2.uid = 1091 
     AND (l1.status = 1 AND l2.status = 1) 
     AND u.gender = 2 
GROUP BY l1.uid 
ORDER BY 
    total DESC, 
    l1.uid DESC, 
    l1.date DESC 

Was erwarte ich: Es sollten alle Benutzer anzuzeigen, sortiert nach Gesamt Seite mag wir gemeinsam haben, dass auch die am liebsten Benutzer in dieser Woche sind.

Die Sache ist, dass ich Werte (391 und 1091) als Benutzer-ID eingefügt, um die Abfrage zu testen. Aber da es dynamisch sein sollte, muss ich die Zeile der ersten Abfrage l1.uid in der Unterabfrage verwenden, also sollte es WHERE p1.uid = l1.uid AND p2.uid = 1091 sein, aber mysql kann die Zeile nicht finden.

status = 1 bedeutet Benutzer mochte diese Seite, status = 0 bedeutet, dass Benutzer diese Seite nicht mochte.

Tabellenstruktur hier:

CREATE TABLE pages_likes 
(
    id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    uid INT NOT NULL, 
    date DATETIME NOT NULL, 
    item_id INT, 
    status TINYINT 
); 
CREATE INDEX item_index ON pages_likes (item_id); 
CREATE INDEX uid_index ON pages_likes (uid); 

CREATE TABLE users 
(
    id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    fb_uid VARCHAR(255), 
    email VARCHAR(100) NOT NULL, 
    pass VARCHAR(50) NOT NULL, 
    gender TINYINT NOT NULL, 
    birthdate DATE, 
    signup DATETIME NOT NULL, 
    lang VARCHAR(10) NOT NULL, 
    username VARCHAR(255), 
    prename VARCHAR(255) NOT NULL, 
    surname VARCHAR(255) NOT NULL, 
    projects VARCHAR(255) NOT NULL, 
    views INT DEFAULT 0, 
    verified DATETIME 
); 
CREATE UNIQUE INDEX id_index ON users (id); 
CREATE INDEX uid_index ON users (id); 

CREATE TABLE users_likes 
(
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    uid INT NOT NULL, 
    date DATETIME NOT NULL, 
    item_id INT, 
    status TINYINT 
); 
CREATE INDEX item_index ON users_likes (item_id); 
CREATE INDEX uid_index ON users_likes (uid); 
+0

Können Sie Ihr Ziel näher erläutern, wenn möglich mit einem Beispiel. Diese Abfrage wird für einen Benutzer ausgeführt. Zustimmen ? (391 in Ihrem Beispiel?). Kannst du mehr Klarheit darüber haben? Sortiert nach Gesamtanzahl an Seitenlikes, die wir gemeinsam haben, sind auch die beliebtesten Nutzer dieser Woche._ – devoh

+0

Es * ist * kompliziert. Kannst du es vielleicht zu dem Teil destillieren, den du problematisch findest? – Strawberry

+0

Mein Hauptziel ist jetzt, nach Seitenlikes zu sortieren, die ich mit Benutzern gemeinsam habe (was die SELECT-Unterabfrage-Unterabfrage ist). Ich benutze 'SUM' in einer Unterabfrage, um zu sehen, wie viele Zeilen es in der nächsten Unterabfrage gibt. Es ist also hauptsächlich der Unterabfrageteil. Ich habe meine vollständige Abfrage angezeigt, weil ich vielleicht die gesamte Abfrage verbessern könnte oder nicht einmal die Unterabfrage benötigt? Ich konnte jedoch keine andere Möglichkeit finden, gängige Likes mit Nutzern zu erhalten. Nur mit dieser Unterabfrage-Unterabfrage. – AlexioVay

Antwort

0

Haben Sie versucht, verschiedene Alias-Namen für Ihre Unterabfrage und dann Alias ​​von äußeren Abfrage verwenden? Es funktioniert für mich in diesem einfachen Beispiel: http://rextester.com/MJOL87502

Leider kann ich nicht in Ihrer SQLFiddle testen, da diese Website oft nicht reagiert oder Fehler (wie jetzt) ​​wirft.

Sie könnten auch Fensterfunktionen verwenden und Ihren Subselect durch etwas so einfaches wie SUM(*) OVER (PARTITION BY p1.id, p1.item_id) ersetzen, aber MySQL unterstützt keine Fensterfunktionen.

+0

Ich denke, das Problem ist, dass ich eine Unterabfrage in einer Unterabfrage habe, weil ich den COUNT der inneren Unterabfrage SUMME. Ich habe meine Tabellenstruktur bearbeitet und zu meiner Frage hinzugefügt. – AlexioVay

Verwandte Themen