2011-09-22 41 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在頂級查詢中可用。 –