2017-02-14 82 views
0

我有一點複雜的查詢:使用子查詢中第一個查詢的行嗎?

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 

我期待什麼:它應該顯示所有用戶,通過總頁面排序喜歡我們共同這也是本週最喜歡的用戶。

問題是我插入值(391和1091)作爲用戶ID來測試查詢。但由於它應該是動態的,所以我需要在子查詢中使用第一個查詢l1.uid的行,所以它應該是WHERE p1.uid = l1.uid AND p2.uid = 1091,但mysql無法找到該行。

status = 1表示用戶喜歡此頁,status = 0表示用戶不喜歡此頁面。

表結構在這裏:

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

你能解釋一下你的目標嗎?如果可能的話,舉個例子。該查詢將爲一個用戶執行。同意? (在你的例子中是391?)。你能更清楚地瞭解這個_頁面總頁數嗎?喜歡我們共同的,也是本週最受歡迎的用戶._ – devoh

+0

它*很複雜。你能把它提煉出來只是你發現有問題的部分嗎? – Strawberry

+0

我現在的主要目標是按照我與用戶共有的頁面進行排序(這是SELECT子查詢 - 子查詢)。我在子查詢中使用'SUM'來查看下一個子查詢中有多少行。所以它主要是子查詢部分。我展示了我的完整查詢,因爲也許我可以改進整個查詢或甚至不需要子查詢?但是,我無法找到另一種方式來獲得與用戶共享的常見頁面。僅限於該子查詢子查詢。 – AlexioVay

回答

0

你試過你的子查詢不同的別名,然後使用別名從外部查詢?它適用於我這個簡單的例子:http://rextester.com/MJOL87502

可悲的是我不能在你的sqlfiddle測試,因爲該網站通常不會響應或拋出錯誤(就像現在這樣)。

你也可以使用窗口函數並用SUM(*) OVER (PARTITION BY p1.id, p1.item_id)這樣簡單的東西替換你的子查詢,但是MySQL不支持窗口函數。

+0

我認爲問題是我在子查詢中有一個子查詢,因爲我想SUM內部子查詢的COUNT。我編輯並添加了我的表格結構到我的問題。 – AlexioVay

相關問題