[英]How to join previous row to each row on multiple columns match in MySQL
我想有一个SQL语句,在该语句中,我将为每一行获得第一行的前一行(由于ID,日期时间或其他原因而为第一行),该行与多列匹配。 有什么想法或者我必须使用DB + app组合?
示例表:
id col1 col2 col3
1 1 2 3
2 1 2 4
3 1 2 5
4 2 2 1
结果(匹配的列为col1和col2,按ID排序):
id col1 col2 col3 priorID priorCol1 priorCol2 priorCol3
1 1 2 3 n n n n
2 1 2 4 1 1 2 3
3 1 2 5 2 1 2 4
4 2 2 1 n n n n
谢谢。
我建议使用这样的SQL函数:
DELIMITER $$
CREATE FUNCTION my_func (idx INT)
RETURNS INT
READS SQL DATA
BEGIN
RETURN (
SELECT t2.ID
FROM test AS t1
LEFT JOIN test AS t2
ON (t1.COL1=t2.COL1 AND t1.COL2=t2.COL2 AND t1.ID > t2.ID)
WHERE t1.ID = idx
ORDER BY t2.ID DESC
LIMIT 1
);
END$$
DELIMITER;
然后在您的SQL查询中使用它
SELECT * FROM test AS t1
LEFT JOIN test as t2 ON (t2.ID=my_func(t1.ID))
ORDER BY t1.ID
不要忘记使用适当的索引,否则您可以在此处轻松创建一个非常缓慢的瓶颈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.