2017-02-14 79 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

相关问题