如何根据MySql上另一个表行的id从max(id)行中选择值

时间:2013-01-12 19:43:57

标签: database

我有产品表,其中包含id,sku,amount,columns id和sku是Unique列。

       products table 
  ---------------------------                                
      sku         |  amount
  ----------------|----------
  1-13-013-000    |  765.00
  4-670-140-NB12  |  864.00
  4-670-153f-NS16 |  912.00
  5-616-40        |  86.00

另一张桌子是带有id,sku,余额
的运动 在此表中,只有id是唯一的。

       movements table           
  id |  sku           | balance
  ---|----------------|----------
  1  |  5-51-51       |  765.00
  2  |  5-616-40      |  11.00
  3  |  5-704-40      |  709.00
  4  |  5-616-40      |  67.00
  5  |  1-13-013-000  |  414.00
  6  |  5-704-40      |  415.00 
  7  |  4-670-140-NB12|  313.00 
  8  |  5-616-40      |  79.00
  9  |  1-83-019-2    |  11.00  
  10 |  5-616-40      |  86.00
  11 |  4-670-140-NB12|  811.00
  12 |  1-13-013-000  |  765.00

我想比较并检查产品表上的每个sku是否有运动
(所以我需要检查移动表)并找到最高身份的最后一个动作
在移动表中并比较余额和金额  我想得到这个结果

  --------------------------------------                                
      sku         |  amount    | balance
  ----------------|------------|--------
  1-13-013-000    |  765.00    | 765.00 
  4-670-140-NB12  |  864.00    | 811.00  <- No match 
  4-670-153f-NS16 |  912.00    |         <-no movement
  5-616-40        |  86.00     | 79.00 

我不需要评论<- No match<-no movement
 任何帮助表示赞赏!
 谢谢你的阅读,
 阿隆

2 个答案:

答案 0 :(得分:0)

如果您尝试从移动表中获取MAX,那么结果似乎不正确。

id |  sku           | balance
---|----------------|----------
1  |  5-51-51       |  765.00
2  |  5-616-40      |  11.00
3  |  5-704-40      |  709.00
4  |  5-616-40      |  67.00
5  |  1-13-013-000  |  414.00
6  |  5-704-40      |  415.00 
7  |  4-670-140-NB12|  313.00 
8  |  5-616-40      |  79.00
9  |  1-83-019-2    |  11.00  
10 |  5-616-40      |  86.00    <-- Max of 5-616-40
11 |  4-670-140-NB12|  811.00   <-- Max of 
12 |  1-13-013-000  |  765.00   <-- Max of 1-13-013-000

这应该会给你想要的结果:

SELECT p.sku, p.amount, m.balance
FROM products p
LEFT JOIN
    (SELECT sku, MAX(balance) AS balance FROM movements
    GROUP BY sku) m ON m.sku = p.sku

<强>结果

|             SKU | AMOUNT | BALANCE |
--------------------------------------
|    1-13-013-000 |    765 |     765 |
|  4-670-140-NB12 |    864 |     811 |
| 4-670-153f-NS16 |    912 |  (null) |
|        5-616-40 |     86 |      86 |

See it in action

答案 1 :(得分:0)

以下代码可以使用:

SELECT
    p.Sku,
    p.Amount,
    m.Balance
FROM
    TestMovements AS m
    INNER JOIN
    (
        SELECT
            MAX(Id) AS Id
        FROM
            TestMovements
        GROUP BY
            Sku
    ) AS MaxIds
    ON
        m.Id = MaxIds.Id
    RIGHT OUTER JOIN
    TestProducts AS p
    ON
        m.Sku = p.Sku