sql如下
两张表,知识库表和文章表,做左连接,测试用户变量在mysql中的应用
SELECT @number AS show1, IF(@number=a.knowledge_id,@temp:=@temp+1,@temp:=1) num, @number:=a.knowledge_id, @number AS show2
FROM article a LEFT JOIN knowledge k ON a.knowledge_id = k.id WHERE a.is_delete = 'N'
问题一
第一次查询,别名show1 都为空, show2不为空代表各自的知识库ID.这是出乎意料中的事情,想不明白为什么show1为空 导致 num 全为1,期望是根据不同的knowledgeId 各自编号。不关闭session的情况下执行第二次查询,结果是期望中的
问题2,
简化sql如下:
SELECT * FROM article a LEFT JOIN knowledge k ON a.knowledge_id = k.id WHERE a.is_delete = 'N'
文章表结构
id knowledeId
1 2
2 3
3 2
知识库表结构
id
1
2
3
按照我理解的笛卡尔积 关联是这样子的
1 2 1 无效
1 2 2 有效
1 2 3 无效
2 3 1 无效
2 3 2 无效
2 3 3 有效
3 2 1 无效
3 2 2 有效
3 2 3 无效
找出来的结果排序应该是
1 2 2
2 3 3
3 2 2
结果结果的顺序是
1 2 2
3 2 2
2 3 3
也就是说外键相同的记录排在一起,而不是按照左边记录的实际顺序排序。我为什么会纠结这个问题?
上面第一个sql 使用@number = a.knowledge_id 就和这记录的knowledge_id顺序有很大关系,之前写的sql包了一层做orderby knowledge_id ,无意间发现它们顺序给我排好了,并不需要包一层排序,有点搞不明白
请指教,拜谢
你没有指定返回排序,数据库可以任意顺序返回符合条件的数据