복붙노트

[SQL] 어떻게 SQL 데이터베이스에 할 수 있습니까 재주문 행

SQL

어떻게 SQL 데이터베이스에 할 수 있습니까 재주문 행

그것은 SQL 데이터베이스에 재정렬 행 수 있습니까? 예를 들어; 어떻게 2 행과 3 행의 값의 순서를 교환 할 수 있습니까?

i는 순서에 따라 상기 값을 표시 할 필요가 있기 때문에 행의 순서는 그다지 중요하다.

모든 해답을 주셔서 감사합니다. 그러나 '에 의한 주문은'나를 위해 작업하지 않습니다.

예를 들어, 나는 데이터베이스에 북마크 목록을 넣어. 나는 쿼리에서 얻는 결과에 따라 표시 할. (안 알파벳 순서대로). 그들은 삽입 바로 그 때.

그러나 사용자는 (그 / 그녀가 원하는 어떤 방법으로) 북마크의 위치를 ​​재 배열 할 수있다. 나는 '로 순서를'사용할 수 없습니다 그래서.

예는 파이어 폭스의 북마크의 방법 북마크 디스플레이입니다. 사용자가 쉽게 위치를 전환 할 수 있습니다. 어떻게 DB에있는 것을 언급 할 수 있습니까?

감사합니다.

해결법

  1. ==============================

    1.당신이 "ListOrder"와 같은 다른 열 필요 것 같은데. 테이블의 모양에 따라서 :

    당신이 "ListOrder"와 같은 다른 열 필요 것 같은데. 테이블의 모양에 따라서 :

    BookMark ListOrder
    ======== =========
      d        1
      g        2
      b        3
      f        4
      a        5
    

    그럼 당신은 ListOrder "에 의해 순서"할 수 있습니다.

    Select * from MyTable Order By ListOrder
    

    사용자가 한 번에 북마크 한 장소를 이동할 수 있다면, 당신은 ListOrder로 정수를 사용하고, 그것들을 교체 할 수 있습니다. 예를 들어, 사용자가 하나의 행까지 "F"를 이동하고자하는 경우 :

    Update MyTable
        Set ListOrder=ListOrder+1
            Where ListOrder=(Select ListOrder-1 From MyTable where BookMark='f')
    
    Update MyTable
        Set ListOrder=ListOrder-1
            Where BookMark='f'
    

    사용자가 위 또는 한 번에 많은 행 아래로 책갈피를 이동 할 수있는 경우에, 당신은 세그먼트의 순서를 변경해야합니다. 사용자가 목록의 상단에 "F"를 이동하고자하는 경우 예를 들어, 당신은 할 필요가 :

    update MyTable
        Set ListOrder=ListOrder+1
            where ListOrder>=1 -- The New position
                and ListOrder <(Select ListOrder from MyTable where BookMark='f')
    
     update MyTable
         Set ListOrder=1 -- The New Position
             Where Bookmark='f'
    
  2. ==============================

    2.다른 언급, 그것은 데이터베이스 테이블의 물리적 순서에 의존하는 것은 좋은 생각이 아니다. 관계형 테이블을 더 주문 목록 이상 정렬되지 않은 세트와 같은 개념이다. 예측할 수없는 결과가 발생할 수있는 특정 물리적 순서를 가정.

    다른 언급, 그것은 데이터베이스 테이블의 물리적 순서에 의존하는 것은 좋은 생각이 아니다. 관계형 테이블을 더 주문 목록 이상 정렬되지 않은 세트와 같은 개념이다. 예측할 수없는 결과가 발생할 수있는 특정 물리적 순서를 가정.

    당신이 필요 같은 사운드는 별도의 열이 저장 사용자의 기본 정렬 순서입니다. 그러나 당신은 여전히 ​​순서로 결과를 표시하는 쿼리에 뭔가를해야합니다.

    클러스터 된 인덱스를 생성하여 데이터베이스에있는 레코드의 물리적 순서를 지정할 수 있습니다,하지만 당신은 임의의 사용자 지정으로 할 싶어 것이 아닙니다. 그리고 그것은 여전히 ​​예기치 않은 결과가 발생할 수 있습니다.

  3. ==============================

    3.귀하의 SELECT 쿼리를 사용하여 ORDER BY. 예를 들어, 사용자의 성으로 순서, 사용 :

    귀하의 SELECT 쿼리를 사용하여 ORDER BY. 예를 들어, 사용자의 성으로 순서, 사용 :

    SELECT * FROM User ORDER BY LastName
    
  4. ==============================

    4.실제 데이터베이스에서 행의 순서는 중요하지한다.

    실제 데이터베이스에서 행의 순서는 중요하지한다.

    당신은 당신이 필요로 주문 쿼리에 ORDER BY 절을 사용해야합니다.

  5. ==============================

    5.데이터베이스는 그들이 원하는 방식으로 데이터를 저장할 수 있습니다. 절 "에 의해 순서"를 사용하면 데이터의 순서를 보장 할 수있는 유일한 방법입니다. 북마크 예제에서는 순서를 나타내는 정수 필드를 가질 수하고 주변 사용자 이동 것들로 해당 필드를 업데이트합니다. 해당 열 BY 다음 순서는 올바른 순서로 일을 얻을 수 있습니다.

    데이터베이스는 그들이 원하는 방식으로 데이터를 저장할 수 있습니다. 절 "에 의해 순서"를 사용하면 데이터의 순서를 보장 할 수있는 유일한 방법입니다. 북마크 예제에서는 순서를 나타내는 정수 필드를 가질 수하고 주변 사용자 이동 것들로 해당 필드를 업데이트합니다. 해당 열 BY 다음 순서는 올바른 순서로 일을 얻을 수 있습니다.

  6. ==============================

    6.나는 당신을 위해 무엇을 찾고있는 것으로 간단한 순서를 추측?

    나는 당신을 위해 무엇을 찾고있는 것으로 간단한 순서를 추측?

    select my_column from my_table order by my_order_column;
    
  7. ==============================

    7.다른 사람에 의해 순서를 사용 언급했듯이. 주문 데이터에 의존하지 마십시오 물리적 테이블에 존재, 항상 작업중인 데이터를 기반으로, 그것은 하나 개 이상의 키 필드합니다.

    다른 사람에 의해 순서를 사용 언급했듯이. 주문 데이터에 의존하지 마십시오 물리적 테이블에 존재, 항상 작업중인 데이터를 기반으로, 그것은 하나 개 이상의 키 필드합니다.

  8. ==============================

    8.첫째, 나를 테이블의 순서는 중요하지 것이 모두 여기에 동의 할 수 있습니다. 업데이트하는 별도의 [SORTORDER] 열을 사용하고, 주문 절을 포함한다.

    첫째, 나를 테이블의 순서는 중요하지 것이 모두 여기에 동의 할 수 있습니다. 업데이트하는 별도의 [SORTORDER] 열을 사용하고, 주문 절을 포함한다.

    즉 SQL Server 데이터베이스가 실제로 기본 테이블 스토리지의 위치를 ​​강제로 테이블에 하나의 "클러스터 된 인덱스"를 허용 않습니다 말했다. 당신이 뭔가를 특정하여 큰 데이터 세트 항상 쿼리가있는 경우 주로 유용합니다.

  9. ==============================

    9.간단한 정수로 테이블 및 저장에 위치 열을 추가합니다.

    간단한 정수로 테이블 및 저장에 위치 열을 추가합니다.

    여러 사용자 또는 목록을 지원해야하는 경우, 가장 좋은 건 북마크 테이블, 사용자 테이블을 연결하는 테이블을 작성하는 것입니다.

    당신이 날짜를 기준으로 차 목록 순서를 얻을 수있는 행을 삽입 할 때 채워집니다 DATE_CREATED 가정하면.

    select bookmark_id from users_bookmarks where user_id = 1 order by position, date_created;
    
  10. ==============================

    10.내가 몇 번 사용한 것을 이것에 대한 해결책을 가지고 있습니다. 나는 테이블에 추가 필드 "SORT_ORDER"를 유지하고 재정렬 때를 업데이트합니다. 내가 항목과 용기의 일종이있을 때 나는 경우에 이것을 사용했습니다, 그리고 항목의 순서는 컨테이너 내부 편집해야합니다. 재정렬 할 때, 난 단지 행을 업데이트해야 할 (몇 보통 연습에서) 많은하지 의미 현재 컨테이너의 항목에 대한 SORT_ORDER를 업데이트합니다.

    내가 몇 번 사용한 것을 이것에 대한 해결책을 가지고 있습니다. 나는 테이블에 추가 필드 "SORT_ORDER"를 유지하고 재정렬 때를 업데이트합니다. 내가 항목과 용기의 일종이있을 때 나는 경우에 이것을 사용했습니다, 그리고 항목의 순서는 컨테이너 내부 편집해야합니다. 재정렬 할 때, 난 단지 행을 업데이트해야 할 (몇 보통 연습에서) 많은하지 의미 현재 컨테이너의 항목에 대한 SORT_ORDER를 업데이트합니다.

    즉, 나는 다음을 수행 :

    (다른 컨테이너로 항목을 이동하는, 업데이트 "컨테이너 외래 키"후 첫 번째 또는 응용 프로그램에 따라 마지막으로 이동합니다.)

    (업데이트가 많은 수의 항목을 포함하는 경우,이 솔루션은 좋은 방법이라고 생각하지 않습니다.)

    나는 몇 가지 추가 설명과 함께 http://wannapy.blogspot.com/2010/11/reorder-rows-in-sql-database.html에 파이썬과 MySQL을 사용하는 예 (복사하고 그것을 시도를) 만들었습니다.

  11. ==============================

    11.이 같은 시간에, 나는 매트릭스에서 인용 한 생각 나게하고있다 :... "위해 데이터베이스를 시도하지 마십시오 그건 불가능 대신에 진실만을 실현 ... 어떤 순서가없는 그런 다음 볼이 테이블이 그 주문 자체는 누가 주문 테이블을 것입니다. "

    이 같은 시간에, 나는 매트릭스에서 인용 한 생각 나게하고있다 :... "위해 데이터베이스를 시도하지 마십시오 그건 불가능 대신에 진실만을 실현 ... 어떤 순서가없는 그런 다음 볼이 테이블이 그 주문 자체는 누가 주문 테이블을 것입니다. "

    GUI를 통해 MySQL과 작업 할 때, 만들 수있는 결정은 항상있다. 당신이 사용자가 SELECT * FROM 뭔가를 실행하면, MySQL은 항상 어떤 필드에 의해이 주문하는 결정을 내릴 것입니다. 일반적으로,이 차 열쇠가 될 것입니다.

    +----------------
    | id | name     |
    -----------------
    | 1  | Brian    |
    | 2  | Carl     |
    | 3  | Albert   |
    -----------------
    

    쿼리에 명령에 의해 주문을 추가하면 다른 필드에 의해 순서에 결정을 내릴 것입니다.

    얻을 것이다 이름으로 사용자 ORDER에서 예를 선택 *의 경우 :

    +----------------
    | id | name     |
    -----------------
    | 3  | Albert   |
    | 1  | Brian    |
    | 2  | Carl     |
    -----------------
    

    귀하의 질문에 그래서, 당신은 기본 순서하여 표는이 정보를 변경할 것으로 보인다. 그렇게하기 위해서는, 무엇을 당신의 기본 키 필드를 확인 이다. 가장 실용적인 목적을 위해, 고유 식별 자연수있는 것은 트릭을 할 경향이있다. MySQL은이에 대한 AUTO_INCREMENT 기능을 가지고 있습니다. 테이블을 만들 때, 그것은 FIELD_NAME INT NOT NULL AUTO_INCREMENT과 같을 것입니다.

    이 값을 업데이트해야합니다, 당신은 "행 순서"를 변경하려는 경우 :이 모든 말을하는 것입니다. 식별자가 다른 테이블이 필드를 참조하는 데 사용하는 것이 무언가이기 때문에,이 조금 무모 보인다.

    예를 들어, 당신은 되었다면 : UPDATE 테이블 세트 ID = 1 여기서, ID = 2 ;,이 초기 실패의 ID 필드가 동일한 값을 모두 끝나게 모두 고유성은 주장 기본 키 확인 (실패 값을 가지는 것이기 때문에 세트). 당신은 행의 세 가지 업데이트 문을 실행하여이 저글링 수 :

    UPDATE users Set id = 100000000 where id = 1;
    UPDATE users Set id = 1 where id = 2;
    UPDATE users Set id = 2 where id = 100000000;
    

    이것은이 테이블처럼 보이는에 대한 행을 초래할 것입니다 :

    +----------------
    | id | name     |
    -----------------
    | 1  | Carl     |
    | 2  | Brian    |
    | 3  | Albert   |
    ----------------+
    

    어떤 기술적으로이 테이블을 다시 정렬 작동하지만이 거품에있는 것입니다. MySQL은 일관되게 데이터에 따라 한 모든 테이블은 이제 잘못된 데이터로 지적됩니다 관계형 데이터베이스 수단 인. 예를 들어, I는 초기 사용자 테이블을 참조, 생일을 기억하는 테이블을 가지고있다. 그것의 구조는 다음과 같습니다

    +----------------------------+
    | id | user_id  | birthdate  |
    +----------------------------+
    | 1  | 1        | 1993-01-01 |
    | 1  | 2        | 1980-02-03 |
    | 1  | 3        | 1955-01-01 |
    +----------------------------+
    

    사용자 테이블에 ID의 전환, 당신은 생일 테이블의 USER_ID 값을 업데이트해야합니다. 물론 MySQL은이 준비되어 제공됩니다 : "외래 키 제약 조건"를 입력합니다. 수동으로 변경된 모든 값에 대한 참조를 변경하려면만큼 당신이 계단식 업데이트로 외래 키 제약 조건을 모두 구성, 당신은 필요하지 않을 것입니다.

    이러한 쿼리는 모든 수동 작업을 많이하고 잠재적으로 데이터의 무결성을 약화시킬 것이다. 당신은 필드가있는 경우 정기적은 "테이블 순서"이 질문에 마이크 루이스로 인한 대답이 될 것 순위와 순서를 좀 더 현명한 대답을 원하는 (그리고 이런 경우, 그의 최고의 솔루션이며 단지 )이 대답을 무시하십시오.

  12. ==============================

    12.여기에 귀하의 게시물에 대한 응답으로, 당신이 찾고 할 수있는 대답은 :

    여기에 귀하의 게시물에 대한 응답으로, 당신이 찾고 할 수있는 대답은 :

    연대순으로 주문하려면, 날짜 시간 또는 smalldatetime으로 데이터 형식으로 DateAdded 또는 유사한 열을 추가합니다.

    모든 메소드에 데이터베이스에 삽입, 당신은 DateAdded 열에 CURRENT_TIMESTAMP 삽입했는지 확인해야합니다.

    데이터베이스를 쿼리 방법에서 쿼리 문자열의 끝에서 ORDER BY DateAdded를 추가합니다.

    데이터베이스 시스템의 물리적 위치에 의존하지 마십시오. 그것은 모든 시간을 확실히 대부분의 시간을 작동 할 수 있지만.

  13. ==============================

    13.문제는 누군가가 당신에게 정확한 답을 줄 수 있도록하는 어떤 세부 사항이 부족하다. 분명히 당신은 메모리에 기록을 읽을 수 다음을 업데이트합니다. 그러나 이것은 많은 다른 수준에 나쁘다.

    문제는 누군가가 당신에게 정확한 답을 줄 수 있도록하는 어떤 세부 사항이 부족하다. 분명히 당신은 메모리에 기록을 읽을 수 다음을 업데이트합니다. 그러나 이것은 많은 다른 수준에 나쁘다.

    문제는 이런 식이다. 거기에 실제로 구현 된 스키마에 따라 레코드가 물리적으로 디스크에 기록되는 방식에 논리입니다. 때때로 그들은 그들이 블록 (범위 참조) 사이의 공간에 삽입하는 삽입 및 다른 시간의 순서로 작성됩니다.

    실제 순서를 변경하면 열 데이터를 교환하지 않고 가능성이 없습니다 그래서; 이것은 다양한 지표에 깊은 영향을 미친다. 당신은 왼쪽 논리적 순서를 변경 할 필요가있다.

    나는 당신의 업데이 트를 읽으면서 ... 난 당신이 여러 사용자를 가질 수 있음을 이해하는 것이 남아있어 각 사용자는 주문한 원하는 책갈피를하는 것입니다. 당신 같은 외모는 사용자와 북마크 사이의 교차로 역할을하는 두 번째 테이블이 필요합니다. 당신이 필요로하는 모든 조인 내부 및 의해 순서입니다.

    그러나 완벽한 솔루션을 제공하기 위해 충분한 정보가 없다.

  14. ==============================

    14.다음은 MySQL의에서 (한 번에 하나씩) 증가 또는 감소에 저장 프로 시저 스크립트입니다.

    다음은 MySQL의에서 (한 번에 하나씩) 증가 또는 감소에 저장 프로 시저 스크립트입니다.

    위의 답변이 일을하지 않도록주의, MySQL은 같은 쿼리 당신에있어 업데이트를 선택할 수 없습니다.

    나는 또한 감소시키는 / 증가하는 경우 아래 / 위의 어떤 항목이없는 경우는 각각 오류를 반환하도록 설정했다.

    DELIMITER $$
    CREATE PROCEDURE `spReorderSequenceItems` (
      IN _SequenceItemId INT,
      IN _SequenceId INT,
      IN IncrementUp TINYINT,
      OUT Error VARCHAR(255)
    )
    
    BEGIN
      DECLARE CurrentPosition INT;
    
      SELECT Position INTO CurrentPosition
      FROM tblSequenceItems
      WHERE SequenceItemId = _SequenceItemId;
    
      IF IncrementUp = 1 THEN
        IF (
          SELECT Position
          FROM tblSequenceItems 
          WHERE Position = CurrentPosition + 1 AND SequenceId = _SequenceId
        ) THEN
          UPDATE tblSequenceItems
            SET Position = Position - 1
            WHERE Position = CurrentPosition + 1 AND SequenceId = _SequenceId;
          UPDATE tblSequenceItems
            SET Position = Position + 1
            WHERE SequenceItemId = _SequenceItemId;
        ELSE 
          SELECT 'No Item Above' AS _Error INTO Error;
        END IF;
      ELSE
        IF (
          SELECT Position
          FROM tblSequenceItems 
          WHERE Position = CurrentPosition - 1 AND SequenceId = _SequenceId
        ) THEN
          UPDATE tblSequenceItems
            SET Position = Position + 1
            WHERE Position = CurrentPosition - 1 AND SequenceId = _SequenceId;
          UPDATE tblSequenceItems
            SET Position = Position - 1
            WHERE SequenceItemId = _SequenceItemId;
        ELSE
          SELECT 'No Item Below' AS _Error INTO Error;
        END IF;
      END IF;
    END
    $$
    DELIMITER ;
    

    로 전화

    CALL spReorderSequenceItems(1, 1, 1, @Error);
    SELECT @Error;
    
  15. from https://stackoverflow.com/questions/812630/how-can-i-reorder-rows-in-sql-database by cc-by-sa and MIT license