2011-09-22 60 views
1

我有一个SQL查询有一个有连接的子查询。我想重写没有子查询的查询,以便我可以创建一个视图。 MySQL不允许FROM是子查询的SELECT语句。如何重写与查询有联系的子查询SQL查询

这可能吗?我尝试删除外部选择并通过子查询内部移动组。这部分工作,但一些数据不正确。

select * 
from (SELECT r.id, r.dateAdded, r.listingId, r.rating, r.username, r.valid, tbl_data.nameShort, tbl_data.desk, d.model, d.hardware, d.serial, l.appVersion, r.photoUrl, r.comment 
     FROM tbl_ratings r 
     JOIN tbl_data on r.listingId = vi_data.id 
     JOIN tbl_devices d on r.serial = d.serial 
     JOIN tbl_log l on l.serial = d.serial 
     ORDER BY d.serial, l.dateAdded DESC) x 
group by id 
order by dateAdded DESC 

在此先感谢!

+0

为什么不执行内部查询? –

+0

好吧,我得到7000多个结果,而不是350+,我应该从tbl_ratings中获得。没有群组,我收到了一些重复的信息。 – sho

+0

你打算做“内部加入”还是“加入”,但是不小心获得了“外部加入”? –

回答

1

是化繁为简:

SELECT  r.id, r.dateAdded, r.listingId, r.rating, r.username, r.valid, 
      tbl_data.nameShort, tbl_data.desk, d.model, d.hardware, 
      d.serial, l.appVersion, r.photoUrl, r.comment 
     FROM tbl_ratings r 
     JOIN tbl_data on r.listingId = vi_data.id 
     JOIN tbl_devices d on r.serial = d.serial 
     JOIN tbl_log l on l.serial = d.serial 
     GROUP BY r.id 
     ORDER BY r.dateAdded DESC 

而且,你有提及“vi_data”,是不是其他任何地方查询

+0

谢谢,vi_data是一个错误。它应该是tbl_data。这可以工作,但应用程序版本不正确。它不显示最新的应用程序版本。用户可以运行不同版本的应用程序。在派生表中,我可以通过l.dateAdded进行排序,它给了我最新的日志信息。 – sho

+0

考虑添加一个条款,如“WHERE l.appVersion = xxx'”来限制appVersion ... –

+0

感谢您的帮助。我现在可能只是略过应用程序版本。每个人都不会总是拥有最新版本,因此我无法在查询中指定应用程序版本。 – sho

0

将您的group by子句更改为group by r.id。由于您从派生表(子查询)中进行选择,因此数据库无法知道该派生表中只有一个“id”字段 - 它只能看到子查询中指定的列标题,即r.id

+0

将id更改为r.id不会消除子查询。此外,它给了我一个错误“组声明中的未知列'r.id'” – sho

+0

你可能会更好地消除所有字段的混淆,'select r.id AS rid',然后你会有x.rid在顶级查询中可用。 –