2014-03-28 110 views
0

我有我需要的是依赖于主查询结果的子查询的WHERE子句的问题,否则我的结果是错误的,查询时间过长/不executeable。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` 

这个查询应该计算的总速率对每个讲座的收视率。 但是我的评分存储在我的“评分”表中,应该进行实时处理。 (旁注:如果你想知道所有的连接:这个查询有更多的SELECT'ed字段,我只是删除它们,因为它们不需要解决问题,并使查询看起来不那么复杂[我知道它仍然是>。>] ...)

原因是我希望这个结果可以通过我的搜索引擎排序,这取决于用户排序参数 ,这就是为什么我在这个查询中需要它。

问题本身是很明显的: ERROR 1054(42S22):未知列在“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

一个sidenode:我遇到另一个问题就来了,试图创建一个视图的MySQL告知我“的观点不能包含子查询-.-”。不过,我解决它创建一个视图,选择另一个视图。 Mysql的另一个愚蠢的弱点,但至少我找到了一个快速的工作周。 – Steini