我有两个桌子

表结构是这样的

表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.按C_ID分组
3.分组依据中的最新行

我试图修改How do I join the most recent row in one table to another table?中的Bill Karwin的答案

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   ║
╚═════╩════════╩════════╩═══════════╩═══════╩═════════╝


但是我想要的输出如下所示(dublicate P_ID可以,但是对于每个dublicate P_ID不应该有dublicate 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   ║
╚═════╩════════╩════════╩═══════════╩═══════╩═════════╝

最佳答案

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进行分组,否则未指定将返回为每个组找到的第一行。

10-04 10:39