2012-03-06 27 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