2012-03-06 6 views
0

私のSQLクエリ:SQL呼び出しsubquery2でsubquery1からテーブル

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はその唯一のsubquery1であるためsubquery2に呼び出すことがカントので、私はエラーを取得しています...どのように私はそれを呼び出すことができることを確認することができますsubquery2にも同様に? FROMで上記の加入者をLEFT JOINする必要がありますか?

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

はい、テーブルに参加する必要があります。クエリ全体を投稿する場合は、クエリを最適化し、クエリを短くしてより速く実行するためにできることが他にもあることを賭けています。 – Travesty3

+0

更新された質問 – fxuser

+0

2番目の 'exists'がトピックとサブスクライバをチェックすると、これはサブスクライバのみをチェックし、サブスクライバのみをチェックする以前の' exists'と冗長ではありません。ブロックはすでに真実ですか? –

答えて

0

これらのサブクエリは独立したサブクエリであり、どのデータも共有できません。探している結果を得るには、2番目のサブクエリで結合を行う必要があります。

また、サブクエリを使用しないでこれを行うことができ、ジョインだけを使用するほうがはるかに高速です。

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それは私が持っていたのとほとんど同じ考えです... –

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

+0

[プロダクションクエリで 'select *'を使わない理由はいくつかあります...](http://stackoverflow.com/questions/3180375/select-vs-select-column) –

+0

on GROUP BYあなたは何をupdで書いてみたいですか?おそらくあなたはそこに列をタイプミスしましたか? – fxuser

関連する問題