Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按另一个表自定义订单_Mysql_Sql_Mariadb - Fatal编程技术网

MySQL按另一个表自定义订单

MySQL按另一个表自定义订单,mysql,sql,mariadb,Mysql,Sql,Mariadb,模式: CREATE TABLE IF NOT EXISTS `letters` ( `id` int(11) NOT NULL AUTO_INCREMENT, `letter` char(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; INSERT INTO `letters` (`id`, `letter`) VALUES (1, 'd'), (2, 'f'), (3, 'a'), (4,

模式:

CREATE TABLE IF NOT EXISTS `letters` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `letter` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `letters` (`id`, `letter`) VALUES
    (1, 'd'),
    (2, 'f'),
    (3, 'a'),
    (4, 'e'),
    (5, 'c'),
    (6, 'b');
CREATE TABLE IF NOT EXISTS `sort` (
  `next` int(11) NOT NULL,
  `prev` int(11) DEFAULT NULL,
  PRIMARY KEY (`next`),
  UNIQUE KEY `prev` (`prev`),
  CONSTRAINT `fk` FOREIGN KEY (`next`) REFERENCES `letters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
INSERT INTO `sort` (`next`, `prev`) VALUES
    (3, NULL),
    (4, 1),
    (6, 3),
    (2, 4),
    (1, 5),
    (5, 6);
如果我现在运行
select letter from letters
我会得到顺序
d,f,a,e,c,b
,但是我想得到字母顺序
a,b,c,d,e,f
不是借助
字母顺序
而是通过
排序
表。如果查看
排序表中的条目,id=3的a是第一个,因为
下一个=3,上一个为空,然后id=6的b是第二个,因为
下一个=6,上一个=3,然后id=5的c是第三个,因为
下一个=5,上一个=6,等等

如何使用MySQL中的另一个表执行自定义订单?

更新

我做到了,这可能是在mysql中做到这一点的唯一方法:

DELIMITER //
CREATE PROCEDURE `custom_select`()
begin

declare v_next int;
declare v_letter char(1);
declare v_count tinyint;

DROP TEMPORARY TABLE IF EXISTS temp;
CREATE TEMPORARY TABLE temp (id int,letter char(1),idx int AUTO_INCREMENT,PRIMARY KEY (idx));

select id,letter,count(*) into v_next,v_letter,v_count from letters where sort=0;
while v_next is not null do
  insert into temp(id,letter)values(v_next,v_letter);
  select id,letter,count(*) into v_next,v_letter,v_count from letters where sort=v_next;
end while;

select id,letter from temp order by idx;
end//
DELIMITER ;

CREATE TABLE IF NOT EXISTS `letters` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `letter` char(1) DEFAULT NULL,
  `sort` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sort` (`sort`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

DELETE FROM `letters`;

INSERT INTO `letters` (`id`, `letter`, `sort`) VALUES
  (1, 'd', 5),
  (2, 'f', 4),
  (3, 'a', 0),
  (4, 'e', 1),
  (5, 'c', 6),
  (6, 'b', 3);
然后我得到了预期的
a、b、c、d、e、f

CALL custom_select

因为MySQL不支持递归CTE,所以在MySQL中用一个sql查询是无法做到这一点的。那么,按某个sql函数()排序怎么样?我打开了这个。在一个函数中可以包含所有必要的查询。我想这太慢了。对我来说,这似乎是一个糟糕的db设计(虽然我不知道实际需求是什么)。但是为什么???如果您的表以这种方式增长是我的选择之一(首选),那么这需要大量递归,另一个
是按字段排序(id,3,6,5,1,4,2)
。稍后我将根据每种查询的优缺点来决定哪一种更好。MySQL中的一个sql查询无法做到这一点,因为MySQL不支持递归CTE。那么,
order by some_sql_function()
呢?我打开了这个。在一个函数中可以包含所有必要的查询。我想这太慢了。对我来说,这似乎是一个糟糕的db设计(虽然我不知道实际需求是什么)。但是为什么???如果您的表以这种方式增长是我的选择之一(首选),那么这需要大量递归,另一个
是按字段排序(id,3,6,5,1,4,2)
。我将不得不根据它们各自的优缺点,稍后再决定哪一个更好。