使用SQL查询在给定位置信息中查找数据

时间:2012-12-28 18:35:37

标签: php sql mysqli

我有一个像以下

的表格结构
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查询?

4 个答案:

答案 0 :(得分:3)

假设您要查找给定p_id的max 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上的不等式进行ANTI-JOIN

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

答案 1 :(得分: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';

答案 2 :(得分: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"

答案 3 :(得分: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'