我有3个表blog_articles
,blog_tags
和blog_articles_tags
。非常基本的东西,一个文章可以有标签的博客。
CREATE TABLE `blog_articles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`body` text NOT NULL,
`datetime` datetime NOT NULL,
`author` int(10) unsigned DEFAULT NULL,
`published` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `author` (`author`),
FULLTEXT KEY `title` (`title`,`body`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `blog_articles_tags` (
`article` int(10) unsigned NOT NULL,
`tag` int(10) unsigned NOT NULL,
PRIMARY KEY (`article`,`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `blog_tags` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`description` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
这是一个工作示例,选择带有标签和作者的博客文章
但如果我将排序从降序切换为升序,我会搞砸结果
但是,如果从要删除的列列表中删除blog_tags
表的列,则顺序正确
我想问两个问题:
我无法修改SQL语句,因为这是一个自动生成的语句,我无法确定(如果有的话)排序将是什么,以及添加到select子句的任何连续列是否会进一步改变结果。< / p>
答案 0 :(得分:0)
除非您指定ORDER BY
,否则SQL中的查询将是无序的。您碰巧得到的任何订单都是实施的工件,不能依赖。
您的某个虚拟表中有ORDER BY
,但外部查询没有任何内容。由于它包含多个连接,因此您甚至无法依靠MySQL同时保留虚拟表的顺序。
没有理由在子查询中放置ORDER BY
,除非您正在做一些像添加行号这样的高级操作。因此,可以删除整个子查询,只需加入blog_articles
即可。然后你可以ORDER BY blog_articles.id
。