我有一個像下面查找數據
idx p_id location_id
1 CTX A1
2 CTX A2
3 ABC A3
4 ABC A1
IDX的表結構是自動遞增號,表示最新的位置 (產品CTX情況下,從A1轉移到A2 )
現在,我想找到的是位置A1中的任何產品。 我應該只找到產品ABC,因爲產品CTX從A1移動到A2,它不再位於A1
有沒有簡單的方法來執行SQL查詢?
我有一個像下面查找數據
idx p_id location_id
1 CTX A1
2 CTX A2
3 ABC A3
4 ABC A1
IDX的表結構是自動遞增號,表示最新的位置 (產品CTX情況下,從A1轉移到A2 )
現在,我想找到的是位置A1中的任何產品。 我應該只找到產品ABC,因爲產品CTX從A1移動到A2,它不再位於A1
有沒有簡單的方法來執行SQL查詢?
假設你想尋找到一個給定的p_id最大DX有「A1」的位置都行
SELECT t.*
FROM table1 t
INNER JOIN (SELECT p_id,
Max(dx) dx
FROM table1
GROUP BY p_id) max_dx
ON t.dx = max_dx.dx
WHERE t.location_id = 'A1'
如果你不喜歡某種原因,你可以做一個不平等的反連接的PK
0123次查詢SELECT t.*
FROM table1 t
LEFT JOIN table1 t2
ON t.p_id = t2.p_id
and t.dx < t2.dx
WHERE
t2.dx IS NULL
and t.location_id = 'A1'
哇,謝謝很多。它的工作原理 – user1084885
好,重新閱讀您的問題後,我覺得這是更需要什麼:
SELECT idx, p_id, location_id
FROM tablename t0 JOIN (
SELECT MAX(idx) AS m
FROM tablename
GROUP BY p_id) t1
ON t0.idx = t1.m
WHERE t0.location_id = 'A1';
重新閱讀問題後,我認爲這不是OP所期待的。我正在努力完善... –
爲了公平起見,您應該正確地閱讀您的問題,然後在提出問題之前向Conrad Frix回答問題。 :) –
最笨的方法:
SELECT TOP 1 PRODUCT_ID
FROM YOUR_TABLE
WHERE
LOCATION_ID = "A1" -- of course use parameter in real application!
ORDER BY
ID DESC
無論其!這是不正確的,因爲不能安全地依賴IDS的排序(即使它在99%的情況下工作)。爲什麼不添加時間戳列?
您也可以使用MAX()函數來得到一個子查詢返回的最大ID:
SELECT PRODUCT_ID
FROM YOUR_TABLE
WHERE
LOCATION_ID = "A1" -- of course use parameter in real application!
AND
ID = SLECT MAX(ID) FROM YOUR_TABLE WHERE LOCATION_ID = "A1"
如果你在每一行之前有四個空格,你的帖子將被很好的格式化。如果您選擇您的代碼並按下「{}」按鈕,它將會格式化您的代碼。此外TOP 1不會在mysql –
您可以使用ROW_NUMBER以獲得最新的位置,而無需使用相關子查詢。
SELECT * FROM
(
SELECT p_id, location_id, ROW_NUMBER() OVER(PARTITION BY p_id ORDER BY idx DESC) RowNumber
) x
WHERE RowNumber = 1 AND location_id = 'A1'
在表CTX
不幸的是mySQL不支持Row_Number()。雖然你可以這樣做(http://stackoverflow.com/a/1895127/119477),但如果有多個產品ID具有相同的位置ID,則很難獲得(PARTITION BY的工作) –
,只會給最新的結果。 – sourcecode
@ConradFrix oops,我錯過了mysql標籤。我會留下答案,因爲它可能對其他人有用。 – jlnorsworthy
,A1從A1更改爲A2 – sourcecode
通過權,必須有一個更新... – bonCodigo
如果更新會在那裏那麼他只會得到期望的結果後,保存或者被刪除..但是這不是他插入行而沒有任何更新到前一個.. – sourcecode