2012-12-28 22 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