2014-03-28 10 views
0

기본 쿼리의 결과에 따라 하위 쿼리에서 WHERE 절이 필요합니다. 그렇지 않으면 내 결과가 잘못되고 쿼리가 너무 오래 걸리고/않습니다 실행할 수 있습니다.MySQL 쿼리 (하위 쿼리의 mainquery 액세스)

검색 서버에 필요한 뷰를 만들 때이 쿼리가 필요한 상황에서이 쿼리를 두 개의 쿼리로 나눌 수없고 스크립트로 동적으로 처리 할 수 ​​없다는 문제를 지원합니다.

문제는 다음과 같은 쿼리를 발생

SELECT `s`.`id` AS `seminar_id`, (SUM(`sub`.`seminar_rate`)/COUNT(`sub`.`seminar_id`)) AS `total_rate` 
    FROM 
    (
     SELECT (SUM(value)/COUNT(*)) AS `seminar_rate` , `r`.`seminar_id` 
     FROM `rating` r 
     INNER JOIN `rating_item` ri ON `r`.`id` = `ri`.`rating_id` 
     WHERE `r`.`seminar_id` = `s`.`id`/* <- Here is my problem, this is inacessible */ 
     GROUP BY `r`.`seminar_id` 
    ) AS sub, 
    `seminar` s 
    INNER JOIN `date` d 
    ON `s`.`id` = `d`.`seminar_id` 
    INNER JOIN `date_unit` du 
    ON `d`.`id` = `du`.`date_id`   
    LEFT JOIN `seminar_subject` su 
    ON `s`.`id` = `su`.`seminar_id` 
    LEFT JOIN `subject` suj 
    ON `su`.`subject_id` = `suj`.`id` 
    INNER JOIN `user` u 
    ON `s`.`user_id` = `u`.`id` 
    INNER JOIN `company` c 
    ON `u`.`company_id` = `c`.`id` 
    GROUP BY `du`.`date_id`, `sub`.`seminar_id` 

이 쿼리는 각 세미나에 대한 평가에서 총 비율을 계산한다. 그러나 등급은 내 "등급"테이블에 저장되므로 실시간으로 처리해야합니다.

(Sidenote : 모든 조인에 대해 궁금한 사람 :이 쿼리는 SELECT로 연결된 필드가 더 많습니다. 문제를 해결하고 쿼리의 복잡성을 덜어주기 위해 nesessary가 아니기 때문에 삭제했습니다. 여전히>.>] ...)

이유는 내가이 검색 결과를 나중에 사용자 검색 매개 변수에 따라 에 의존하여 검색 엔진에서 정렬 할 수있게하려는 것입니다.이 쿼리 내에서 필요합니다.

문제 자체는 매우 분명하다 : 1054 (42S22) ERROR : 해결책은 알 수없는 열이 'where 절'은 부속 나던 메인 쿼리의 결과에 대해 알고

에 's.id'가있다 이걸 무시해?

누군가 나에게이 작업을위한 힌트를 줄 수 있습니까?

미리 감사드립니다.

+0

나는 이것을보고 싶다! - 누가 먼저 왔어? 닭이나 계란? - (귀하의 질문) –

답변

1

JOIN에서 하위 쿼리를 사용하면 WHERE 절을 제거하고 거의 동일한 결과를 얻을 수 있습니다. 다음은 수정 된 쿼리입니다. 희망이 당신의 문제를 해결합니다.

SELECT `s`.`id` AS `seminar_id`, (SUM(`sub`.`seminar_rate`)/COUNT(`sub`.`seminar_id`)) AS `total_rate` 
FROM `seminar` s 
INNER JOIN 
(
    SELECT (SUM(value)/COUNT(*)) AS `seminar_rate` , `r`.`seminar_id` 
    FROM `rating` r 
    INNER JOIN `rating_item` ri ON `r`.`id` = `ri`.`rating_id` 
    /*WHERE `r`.`seminar_id` = `s`.`id` <- Here is my problem, this is inacessible */ 
    GROUP BY `r`.`seminar_id` 
) AS sub ON s.id = sub.`seminar_id` 
INNER JOIN `date` d 
ON `s`.`id` = `d`.`seminar_id` 
INNER JOIN `date_unit` du 
ON `d`.`id` = `du`.`date_id`   
LEFT JOIN `seminar_subject` su 
ON `s`.`id` = `su`.`seminar_id` 
LEFT JOIN `subject` suj 
ON `su`.`subject_id` = `suj`.`id` 
INNER JOIN `user` u 
ON `s`.`user_id` = `u`.`id` 
INNER JOIN `company` c 
ON `u`.`company_id` = `c`.`id` 
GROUP BY `du`.`date_id`, `sub`.`seminar_id` 
+0

이것은 실제로 내 문제를 해결했습니다! 쉽고 빠르게 쿼리를 변경할 필요가 없습니다. 고마워! : D – Steini

+0

가장 환영합니다. :) – Neels

+1

사이드 노드 : 뷰를 만들려고 할 때 MySQL이 "뷰에 하위 쿼리 -.-를 포함 할 수 없습니다."라는 다른 문제가 발생했습니다. 그러나 나는 그것을 다른보기를 선택하는보기를 만드는 해결했습니다. MySQL의 또 다른 어리석은 약점, 그러나 나는 그것을 위해 빠른 workarround를 찾았다. – Steini