2012-03-06 1 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에 ... 내가 어떻게 내가 그것을 호출 할 수 있는지 확인 할 수 있습니다 subquery2에뿐만 아니라? FROM에 위의 구독자를 LEFT JOIN해야합니까?

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

예, 테이블을 가입해야합니다. 전체 쿼리를 게시하는 경우 쿼리를 최적화하고 더 짧게 만들고 더 빠르게 실행할 수있는 방법이 더 많습니다. – Travesty3

+0

업데이트 된 질문 – fxuser

+0

내가 얻지 못하는 것 ... 두 번째'존재 '가 주제와 구독자를 확인하면 이전의'존재'와 중복되지 않고 구독자 만 확인합니다. 그 블록은 이미 사실입니까? –

답변

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 꽤 많은 생각을 가지고 있기 때문에 ... –

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