[英]INNER JOIN not returning results
大家下午好! 我已經為此工作了兩天,卻不知道為什么它不起作用。 我嘗試了幾種不同的方法來獲得正確的結果,或者返回太多或為0。我有兩個表,用於跟蹤具有以下布局的資產:
表:資產管理
id | serial | idcode
---|--------|-------
1 | 123 | 4
2 | 1234 | 4
表格:AssetManagement_History
id | rowID | action | occurred
---|--------|-----------|-------------
1 | 1 | shipping | 2014-04-01
2 | 1 | stocked | 2014-04-02
3 | 1 | installed | 2014-04-03
4 | 2 | stocked | 2014-04-04
在此示例中,AssetManagement_History.rowID與AssetManagment.id相關,因此您可以看到第一個資產有三個歷史記錄詳細信息,而第二個資產只有一個歷史記錄詳細信息。 我需要退還上次操作對應於“庫存”或“重新庫存”的所有資產-因此僅應退還第二項資產。 這是我嘗試過的幾個mySQL語句:
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement tblASSET
INNER JOIN
(SELECT occurred,max(id) id
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblASSET.id = tblAH.rowID
WHERE tblASSET.idcode='4' AND tblAH.action IN ('stocked','restocked')
另一嘗試:
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement tblASSET
INNER JOIN
(SELECT max(rowID) rowID
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblAH.rowID = tblASSET.id
WHERE tblASSET.idcode='4'
我還有其他幾個人,但是他們也沒有工作。 任何幫助將不勝感激!
謝謝戴夫
SELECT
A.id,
A.serial
FROM AssetManagement A
INNER JOIN ( -- Join to get our latest history ID
SELECT
H.rowID,
MAX(H.ID) ID
FROM AssetManagement_History H
GROUP BY H.rowID
) H1
ON H1.rowID = A.id
INNER JOIN AssetManagement_History H2 -- Join to get the row for the latest history
ON H2.ID = H1.ID
WHERE
H2.action IN ('stocked', 'restocked')
AND
A.IDCode = 4
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement AS tblASSET
INNER JOIN AssetManagement_History AS tblAH
ON tblAH.rowID = tblASSET.id
WHERE tblASSET.idcode='4'
您收到什么錯誤消息? 您希望您的結果看起來像什么?
嘗試使用NOT EXISTS
,(注釋中有解釋)
SELECT tblASSET.id, tblASSET.serial
FROM AssetManagment AS tblASSET
INNER JOIN AssetManagement_History AS tblAH
ON tblAH.rowID = tblASSET.id
WHERE tblASSET.idcode = '4'
AND tblAH.action IN ('stocked','restocked')
--/*And not exists occurred that is greater for the same rowID*/
AND NOT EXISTS (SELECT 1 FROM AssetManagement_History AS his
WHERE his.rowID = tblAH.rowID
AND his.occurred > tblAH.occurred )
編輯:修改了查詢中的錯誤,這是一個有效的SQL FIDDLE 。
這更像是格式化的評論而不是答案
這個:
INNER JOIN
(SELECT occurred,max(id) id
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblASSET.id = tblAH.rowID
由於tblAH沒有名為rowID的字段,因此將引發錯誤。 這個:
INNER JOIN
(SELECT max(rowID) rowID
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblAH.rowID = tblASSET.id
由於您的愚蠢子查詢,可能給出奇怪的結果。 您正在按未選擇的字段分組。 單獨運行該子查詢,看看它是否返回您期望的結果。
我認為這就是您要尋找的。 您需要在子查詢中的操作上應用where子句。
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement tblASSET
INNER JOIN (SELECT occurred,max(id) id
FROM AssetManagement_History
where action in IN ('stocked','restocked') GROUP BY occurred
) tblAH ON tblASSET.id = tblAH.id
WHERE tblASSET.idcode='4'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.