使用子查询重写MySQL查询版本3.23.58

时间:2012-10-16 08:39:43

标签: mysql sql

我需要一些有关MySQL版本3.23.58的数据库查询的帮助。

原则上我想做这个查询(包括一些php):

SELECT * 
FROM abstracts 
LEFT JOIN 
(SELECT * FROM reviewdata WHERE reviewerid='$userid') as reviewdata 
ON abstracts.id=reviewdata.abstractid  
WHERE session='$session'

简而言之,如果审稿人已经审阅了摘要,我想要一个包含所有摘要和摘要的reviewdata的列表。否则我仍然想要抽象但有空的reviewdata(以便他可以改变它)。

上述查询在较新版本中运行正常但在旧版本中我不允许使用子查询,因此MySQL在LEFT JOIN中使用嵌套SELECT时会抱怨。

所以现在我正在寻找避免这个子查询的方法......

我试过了:

SELECT * 
FROM  abstracts 
LEFT JOIN reviewdata 
ON abstracts.id=reviewdata.abstractid  
WHERE session='$session' AND (reviewerid='$userid' or reviewerid is null) 

但是这导致其他评论者审查的摘要,但不是由这个特定的评论者审查,根本没有为他显示。

我的问题是我不知道当时允许什么......

2 个答案:

答案 0 :(得分:1)

如果没有旧安装,我无法尝试这一点,但请尝试在ON子句中检查reviewerid。

SELECT * 
FROM abstracts 
LEFT OUTER JOIN reviewdata  
ON abstracts.id=reviewdata.abstractid  
AND reviewerid='$userid'
WHERE session='$session'

答案 1 :(得分:0)

从我的角度来看,您的重构查询应该显示所有审阅者的摘要,包括特定的审阅者。以下条件

 AND (reviewerid='$userid' or reviewerid is null) 

没有任何意义,可以被删除。为了将结果集限制在特定审阅者的数据中,您必须排除or reviewerid is null部分 尝试

SELECT * 
FROM  abstracts 
LEFT JOIN reviewdata 
ON abstracts.id=reviewdata.abstractid  
WHERE session='$session' AND reviewerid='$userid'

另一个建议 - 在查询

中指定字段时使用别名