我有一个像下面查找数据
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