0

我有两张桌子

表结构是这样的

表 A

╔══════╦════════╗
║ P_ID ║ P_NAME ║
╠══════╬════════╣
║    1 ║ name1  ║
║    2 ║ name2  ║
║    3 ║ name3  ║
║    4 ║ name5  ║
╚══════╩════════╝

表 B

╔═════╦════════╦════════╦═══════════╦═══════╗
║ ID  ║  P_ID  ║  C_ID  ║  C_PRICE  ║  TIME ║
╠═════╬════════╬════════╬═══════════╬═══════╣
║  1  ║      1 ║      3 ║        11 ║ 11111 ║
║  2  ║      2 ║      4 ║        22 ║ 22222 ║
║  3  ║      3 ║      5 ║        33 ║ 33333 ║
║  4  ║      3 ║      6 ║        44 ║ 44444 ║
║  5  ║      3 ║      6 ║        55 ║ 55555 ║
║  6  ║      4 ║      7 ║        66 ║ 66666 ║
╚═════╩════════╩════════╩═══════════╩═══════╝

要求是
1. 连接两个表
2. Group By C_ID
3. Group By 中的最新行

我试图从如何将一个表中的最新行加入到另一个表中修改比尔卡尔文的答案?

SELECT e.*, s1.*  
FROM table_a e   
INNER JOIN
table_b s1
    ON (e.p_id = s1.p_id)   
LEFT OUTER JOIN table_b s2
    ON (e.p_id = s2.p_id AND s1.id < s2.id) 
WHERE s2.p_id IS NULL;

但我无法实现我想要的。从他的回答中我会得到

╔═════╦════════╦════════╦═══════════╦═══════╦═════════╗
║ ID  ║  P_ID  ║  C_ID  ║  C_PRICE  ║  TIME ║  P_NAME ║
╠═════╬════════╬════════╬═══════════╬═══════╬═════════╣
║  1  ║      1 ║      3 ║        11 ║ 11111 ║ name1   ║
║  2  ║      2 ║      4 ║        22 ║ 22222 ║ name2   ║
║  5  ║      3 ║      6 ║        55 ║ 55555 ║ name3   ║
║  6  ║      4 ║      7 ║        66 ║ 66666 ║ name5   ║
╚═════╩════════╩════════╩═══════════╩═══════╩═════════╝

但是我想要的输出如下(重复的 P_ID 是可以的,但是对于每个重复的 P_ID 不应该有重复的 C_ID )

╔═════╦════════╦════════╦═══════════╦═══════╦═════════╗
║ ID  ║  P_ID  ║  C_ID  ║  C_PRICE  ║  TIME ║  P_NAME ║
╠═════╬════════╬════════╬═══════════╬═══════╬═════════╣
║  1  ║      1 ║      3 ║        11 ║ 11111 ║ name1   ║
║  2  ║      2 ║      4 ║        22 ║ 22222 ║ name2   ║
║  3  ║      3 ║      5 ║        33 ║ 33333 ║ name3   ║
║  5  ║      3 ║      6 ║        55 ║ 55555 ║ name3   ║
║  6  ║      4 ║      7 ║        66 ║ 66666 ║ name5   ║
╚═════╩════════╩════════╩═══════════╩═══════╩═════════╝
4

2 回答 2

1
SELECT e.*, s1.*
FROM table_a e INNER JOIN 
(SELECT * FROM (SELECT * FROM table_b ORDER BY time DESC) temp GROUP BY c_id) s1;

最里面的 ORDER BY 确保对于相同的 c_id 所需的行总是最先出现,外部的 GROUP BY 将在 c_id 上分组,并且没有指定其他方式将返回为每个组找到的第一行。

于 2012-12-07T08:33:16.010 回答
0

你必须

  1. 加入两个表
  2. 按 C_ID 分组
  3. 按所选字段排序的每个组 desc 的编号行(最后暗示顺序!)
  4. 按行号过滤 = 1。

可以帮助您对行进行编号。

于 2012-12-07T08:31:37.723 回答