2012-03-06 29 views
0

我的SQL查询:SQL调用表

SELECT 
    upd.*, 
    usr.username AS `username`, 
    usr.profile_picture AS `profile_picture` 

    ,(
     SELECT 
     COUNT(lik.id) 
     FROM 
     likes as lik 
     WHERE 
     upd.update_id = lik.item_id 
     AND 
     lik.uid = 118697835834 
     AND lik.type=0 
    ) as liked_update, 
    (
     SELECT 
     COUNT(fav.id) 
     FROM 
     favorites as fav 
     WHERE 
     upd.update_id = fav.item_id 
     AND 
     fav.uid = 118697835834 
     AND fav.type=0 
    ) as favorited_update 

FROM 
    updates AS upd 
    LEFT JOIN 
     users AS usr 
      ON upd.uid = usr.uid 
WHERE 
    upd.deleted=0 
    AND 
    (
     upd.uid=118697835834 
     OR EXISTS 
     (
      SELECT 
      * 
      FROM 
      subscribers AS sub 
      WHERE 
      upd.uid = sub.suid 
       AND sub.uid = 118697835834 
     ) 
    OR EXISTS 
     (
     SELECT 
      * 
     FROM 
      topics as topic 
     WHERE 
      upd.uid = topic.uid 
      AND sub.uid = 118697835834 
    ) 
    ) 

ORDER BY upd.date DESC 
LIMIT 0, 15 

我得到一个错误,因为sub不能在subquery2,因为被称为其仅在subquery1 ...我如何能确保我可以称它为在子查询2以及?我是否必须在FROM之上的LEFT JOIN用户上面?

Unknown column 'sub.uid' in 'where clause' 
+0

是的,你需要加入表格。如果您发布了整个查询,我敢打赌还有更多可以完成的查询来优化您的查询并缩短查询时间并加快运行速度。 – Travesty3 2012-03-06 20:15:22

+0

已更新的问题 – fxuser 2012-03-06 20:17:54

+0

我没有得到的东西......如果第二个“存在”检查主题和订阅者,与前面的“存在”不是多余的,它只检查订户,而不会该块已经是真的? – 2012-03-06 20:57:13

回答

0

这些子查询是独立的子查询,不能共享任何数据。您需要在第二个子查询中进行连接才能获得您正在查找的结果。

另外,很有可能您不需要子查询就可以做到这一点,并且只使用连接速度更快。

1

我不认为你甚至需要子查询。可能的是,你可以加入做到这一切,类似这样的东西(虽然这只是估计不知道你的表):

SELECT * 
FROM your_main_table upd 
INNER JOIN subscribers sub 
    ON upd.uid = sub.suid 
INNER JOIN topics topic 
    ON upd.uid = topic.uid 
WHERE sub.uid = :user 
1

免责声明:这不是测试,是几乎保证需要一些调整为它做你想要什么,但我想你想什么它是非常接近:

SELECT 
    upd.*, 
    usr.username AS username, 
    usr.profile_picture AS profile_picture, 
    COUNT(lik.id) AS liked_update, 
    COUNT(fav.id) AS favorited_update 
FROM 
    updates upd 
    INNER JOIN subscribers sub ON upd.uid = sub.suid 
    INNER JOIN topics topic ON upd.uid = topic.uid 
    LEFT JOIN users usr ON upd.uid = usr.uid 
    LEFT JOIN likes lik ON upd.update_id = lik.item_id AND upd.uid = lik.uid AND lik.type = 0 
    LEFT JOIN favorites fav ON upd.update_id = fav.item_id AND upd.uid = fav.uid AND fav.type = 0 
WHERE 
    upd.deleted = 0 
    AND (
     upd.uid = 118697835834 
     OR sub.uid = 118697835834 
    ) 
GROUP BY 
    upd.*, 
    usr.username, 
    usr.profile_picture 
ORDER BY upd.date DESC 
LIMIT 15 
+0

+1因为这几乎是我的想法... – 2012-03-06 20:55:24

2

我试图重新写你的查询,在保持原来的逻辑......但是,我很不清楚逻辑的某些部分,特别是主题。

SELECT DISTINCT 
    upd.*, -- Probably should not be doing * here... 
    usr.username AS `username`, 
    usr.profile_picture AS `profile_picture` 
    COUNT(DISTINCT lik.id) AS `liked_update`, 
    COUNT(DISTINCT fav.id) AS `favorited_update` 
FROM 
    updates AS upd 
    LEFT JOIN subscribers AS sub ON upd.uid = sub.suid 
    LEFT JOIN topics as topic ON upd.uid = topic.uid 
    LEFT JOIN users AS usr ON upd.uid = usr.uid 
    LEFT JOIN likes AS lik 
     ON lik.item_id = upd.update_id 
     AND lik.uid = upd.uid 
     AND lik.type = 0 
    LEFT JOIN favorites as fav 
     ON upd.update_id = fav.item_id 
     AND fav.uid = upd.uid 
     AND fav.type=0 
WHERE 
    upd.deleted = 0 
    AND (
     upd.uid = 118697835834 
     OR sub.uid = 118697835834 
     OR (topic.uid IS NOT NULL AND sub.uid = 118697835834) 
    ) 
GROUP BY upd..., usr.username, usr.profile_picture 
ORDER BY upd.date DESC 
LIMIT 0, 15 
+0

它更好地调用我只需要的列?如果我需要90%的表格列呢?仍然会提高性能? – fxuser 2012-03-06 20:39:28

+0

[有几个非常好的理由你不应该在生产查询中使用select * ...](http://stackoverflow.com/questions/3180375/select-vs-select-column) – 2012-03-06 20:41:57

+0

GROUP BY你想在upd上写什么......?这导致了一个错误..可能你错过了那里的列? – fxuser 2012-03-06 20:44:15