选择列会混淆行的顺序

时间:2015-11-09 19:51:03

标签: mysql sql

我有3个表blog_articlesblog_tagsblog_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;

这是一个工作示例,选择带有标签和作者的博客文章

enter image description here

但如果我将排序从降序切换为升序,我会搞砸结果

enter image description here

但是,如果从要删除的列列表中删除blog_tags表的列,则顺序正确

enter image description here

我想问两个问题:

  1. 为什么行的顺序会被选中的列更改?
  2. 如何在不在最内层查询之外的任何地方修改SQL语句的情况下防止这种情况发生?
  3. 我无法修改SQL语句,因为这是一个自动生成的语句,我无法确定(如果有的话)排序将是什么,以及添加到select子句的任何连续列是否会进一步改变结果。< / p>

1 个答案:

答案 0 :(得分:0)

除非您指定ORDER BY,否则SQL中的查询将是无序的。您碰巧得到的任何订单都是实施的工件,不能依赖。

您的某个虚拟表中有ORDER BY,但外部查询没有任何内容。由于它包含多个连接,因此您甚至无法依靠MySQL同时保留虚拟表的顺序。

没有理由在子查询中放置ORDER BY,除非您正在做一些像添加行号这样的高级操作。因此,可以删除整个子查询,只需加入blog_articles即可。然后你可以ORDER BY blog_articles.id