2012-12-28 53 views
2

我有一個像下面查找數據

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查詢?

+0

,A1從A1更改爲A2 – sourcecode

+0

通過權,必須有一個更新... – bonCodigo

+0

如果更新會在那裏那麼他只會得到期望的結果後,保存或者被刪除..但是這不是他插入行而沒有任何更新到前一個.. – sourcecode

回答

3

假設你想尋找到一個給定的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' 

SQL Fiddle

如果你不喜歡某種原因,你可以做一個不平等的反連接的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' 

SQL Fiddle

+0

哇,謝謝很多。它的工作原理 – user1084885

1

好,重新閱讀您的問題後,我覺得這是更需要什麼:

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'; 
+0

重新閱讀問題後,我認爲這不是OP所期待的。我正在努力完善... –

+0

爲了公平起見,您應該正確地閱讀您的問題,然後在提出問題之前向Conrad Frix回答問題。 :) –

0

最笨的方法:

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" 
+0

如果你在每一行之前有四個空格,你的帖子將被很好的格式化。如果您選擇您的代碼並按下「{}」按鈕,它將會格式化您的代碼。此外TOP 1不會在mysql –

0

您可以使用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
+0

不幸的是mySQL不支持Row_Number()。雖然你可以這樣做(http://stackoverflow.com/a/1895127/119477),但如果有多個產品ID具有相同的位置ID,則很難獲得(PARTITION BY的工作) –

+0

,只會給最新的結果。 – sourcecode

+0

@ConradFrix oops,我錯過了mysql標籤。我會留下答案,因爲它可能對其他人有用。 – jlnorsworthy