2015-05-08 172 views
1

我现在所拥有的一个相当大的SQL查询:检查是否在另一个表中存在一个id

SELECT a . * , ap . * , i . * , appstatus . * ,(SELECT SUM(rating)/count(case when rating > 0 then 1 end) AS total_rating FROM review AS r WHERE r.applyid=a.applyid GROUP BY applyid) AS total_rating, (SELECT count(rating) FROM review AS r WHERE r.applyid=a.applyid GROUP BY applyid) as count 
       FROM apply AS a, applicant AS ap, interest AS i, application_status AS appstatus, apply_tags as at 
       WHERE a.applicantid = ap.applicantid 
       AND a.applicantid = i.applicantid 
       AND a.application_status_id = appstatus.application_status_id 
       AND a.archive = 'false' 
       AND a.jobid =27 

我需要修改这个让另一台也检查,看看是否在它存在a.applyid或不。

根据我现有的查询,我想对其进行修改,因此它只会输出apply_tags表中没有数据的行。

我不知道最好的方法将其整合到我的查询中。我应该使用连接吗?

我基本上希望增加一个与声明是这样的:

AND a.applyid NOT EXIST at.applyidat是apply_tags表)

我知道我这样做不对,但就是那种东西的例子我正在努力。

+0

你真的需要'a。 *,ap。 * , 一世 。 *,appstatus。 *'这些表中的所有列 –

回答

2

对不起,我看你已经选择一个正确答案。但是你的查询与完美无关。因此,这里只为你一个想法,您的查询可能是怎么样的,如果你想优化它第一天:

SELECT a . * , 
ap . * , 
i . * , 
appstatus . * , 
r.total_rating, 
r.count 
FROM apply AS a 
LEFT JOIN (
    SELECT applyid, 
    SUM(rating)/SUM(IF(rating > 0,1,0)) AS total_rating, 
    SUM(IF(rating > 0,1,0)) as count 
    FROM review 
    GROUP BY applyid) AS r 
ON r.applyid=a.applyid 
LEFT JOIN applicant AS ap 
ON a.applicantid = ap.applicantid 
LEFT JOIN interest AS i 
ON a.applicantid = i.applicantid 
LEFT JOIN application_status AS appstatus 
ON a.application_status_id = appstatus.application_status_id 
LEFT JOIN apply_tags as at 
ON a.applyid = at.applyid 
WHERE a.archive = 'false' 
    AND a.jobid =27 
    AND at.applicantid IS NULL 

小说明在原来的查询,你做这样的事情:

SELECT a . * , 
..., 
(SELECT SUM(rating)/count(case when rating > 0 then 1 end) AS total_rating FROM review AS r WHERE r.applyid=a.applyid GROUP BY applyid) AS total_rating, 
(SELECT count(rating) FROM review AS r WHERE r.applyid=a.applyid GROUP BY applyid) as count 
.... 

你问这个技术有什么问题?所以问题在于MySQL会尝试从a.table接收到的每条记录上执行这2 SELECT。与我的LEFT JOIN相反,这将只需要一次所有记录。如果你在a有100条记录,MySQL会调用你的子查询100x2 = 200倍,并且只有1个我的子查询。

WHERE a.applicantid = i.applicantidLEFT JOIN i ON a.applicantid = i.applicantid几乎相同的原因。最后一个由MySQL绝对优化。第一个是非常缓慢和沉重。如果你忽略了MySQL的特性,那么它就是为它而发明的。你可以从所有5个表中将SELECT *转换为php数组,并执行php端的所有逻辑。

你可以只是谷歌一点。例如:https://stackoverflow.com/a/2242015/4421474

+0

我只是好奇为什么要改变连接?它比使用正常的AND更快吗? – ComputerLocus

+0

正常的ANDs ??? :-)我只是没有语言:-)我没有改变任何'AND'到'JOIN'。然后用一些解释检查更新的答案。 – Alex

+0

我收到以下SQL错误与此查询:'您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在第8行'LEFT JOIN(SELECT applyid,SUM(rating)/'附近使用正确的语法。'r.count'后面有一个逗号,我不我认为应该在那里,所以我删除了这一点,并且是'SUM(IF(rating> 0,1,0)'作为计数'应该在评分结束时有另一个括号> 0,1,0)部分? – ComputerLocus

相关问题