programing

다른 테이블에 의한 MySQL 사용자 지정 주문

lastmoon 2023. 9. 14. 23:26
반응형

다른 테이블에 의한 MySQL 사용자 지정 주문

http://sqlfiddle.com/ #!9/d865cf/2/1

스키마:

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의 도움이 없이order by letter하지만 사용함으로써.sort표. 에 기재된 내용을 보면,sort테이블, 와id=3첫번째 이유는next=3 and prev is null그다음에 b와id=6두번째 이유는next=6 and prev=3, 그다음에 c로id=5세번째 이유는next=5 and prev=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

언급URL : https://stackoverflow.com/questions/37639967/mysql-custom-order-by-another-table

반응형