一条sql引发的两个问题,这是一个有点深度的问题

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 ,无意间发现它们顺序给我排好了,并不需要包一层排序,有点搞不明白
请指教,拜谢

阅读 1.8k
1 个回答

你没有指定返回排序,数据库可以任意顺序返回符合条件的数据

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题