2009-05-01 65 views
29

Có thể sắp xếp lại các hàng trong cơ sở dữ liệu SQL không? Ví dụ; làm thế nào tôi có thể trao đổi thứ tự của hàng thứ 2 và giá trị của hàng thứ 3?Làm cách nào để sắp xếp lại các hàng trong cơ sở dữ liệu sql

Thứ tự của hàng quan trọng với tôi vì tôi cần hiển thị giá trị theo thứ tự.


Cảm ơn mọi câu trả lời. Nhưng 'Sắp xếp theo' sẽ không hiệu quả đối với tôi.

Ví dụ: tôi đặt danh sách dấu trang trong cơ sở dữ liệu. Tôi muốn hiển thị dựa trên kết quả tôi nhận được từ truy vấn. (không theo thứ tự bảng chữ cái). Chỉ khi chúng được chèn vào.

Nhưng người dùng có thể sắp xếp lại vị trí của dấu trang (theo bất kỳ cách nào họ muốn). Vì vậy, tôi không thể sử dụng 'order by'.

Ví dụ là cách dấu trang hiển thị trong dấu trang trong firefox. Người dùng có thể chuyển vị trí dễ dàng. Làm thế nào tôi có thể đề cập rằng trong DB?

Cảm ơn bạn.

Trả lời

10

Sử dụng ORDER BY trong truy vấn SELECT của bạn. Ví dụ: để đặt hàng theo họ của người dùng, hãy sử dụng:

SELECT * FROM User ORDER BY LastName 
4

Thứ tự của các hàng trên cơ sở dữ liệu thực tế không quan trọng.

Bạn nên sử dụng mệnh đề ORDER BY trong các truy vấn của mình để đặt hàng khi bạn cần.

1

Tôi đoán đơn giản order by sẽ là những gì bạn đang tìm kiếm?

select my_column from my_table order by my_order_column; 
1

Như những người khác đã tuyên bố sử dụng đơn đặt hàng trước.
Không bao giờ phụ thuộc vào dữ liệu đơn đặt hàng tồn tại trong bảng vật lý, luôn dựa vào dữ liệu bạn đang làm việc, có thể là một hoặc nhiều trường khóa.

3

Cơ sở dữ liệu có thể lưu trữ dữ liệu theo bất kỳ cách nào họ muốn. Sử dụng mệnh đề "đặt hàng trước" là chỉ cách để đảm bảo thứ tự dữ liệu. Trong ví dụ đánh dấu trang của bạn, bạn có thể có một trường số nguyên cho biết thứ tự sắp xếp và sau đó cập nhật trường đó khi người dùng di chuyển mọi thứ xung quanh. Sau đó, ORDER BY cột đó để có được những thứ theo thứ tự đúng.

15

Như những người khác đã đề cập, nó không phải là một ý tưởng tốt để phụ thuộc vào thứ tự vật lý của bảng cơ sở dữ liệu. Các bảng quan hệ là khái niệm giống như các bộ không theo thứ tự hơn các danh sách có thứ tự. Giả sử một thứ tự vật lý nhất định có thể dẫn đến kết quả không thể đoán trước.

Âm thanh như những gì bạn cần là một cột riêng biệt lưu trữ thứ tự sắp xếp ưa thích của người dùng. Nhưng bạn vẫn sẽ cần phải làm điều gì đó trong truy vấn của mình để hiển thị kết quả theo thứ tự đó.

Có thể chỉ định thứ tự bản ghi vật lý trong cơ sở dữ liệu bằng cách tạo chỉ mục nhóm, nhưng đó không phải là thứ bạn muốn thực hiện trên cơ sở tùy ý do người dùng chỉ định. Và nó vẫn có thể dẫn đến kết quả bất ngờ.

0

Để đối phó với your post here, câu trả lời bạn có thể tìm kiếm là:

Để đặt thứ tự thời gian, thêm một cột DateAdded hoặc tương tự với một datetime hoặc smalldatetime datatype.

Trên tất cả các phương pháp chèn vào cơ sở dữ liệu, hãy đảm bảo bạn chèn CURRENT_TIMESTAMP vào cột DateAdded.

Trên các phương thức truy vấn cơ sở dữ liệu, hãy thêm ORDER BY DateAdded vào cuối chuỗi truy vấn.

KHÔNG BAO GIỜ dựa vào vị trí vật lý trong hệ thống cơ sở dữ liệu. Nó có thể hoạt động tốt nhất nhưng chắc chắn không phải tất cả thời gian.

63

Có vẻ như bạn cần một cột khác như "ListOrder". Vì vậy, bảng của bạn có thể trông giống như:

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

Sau đó, bạn có thể "sắp xếp theo" ListOrder.

Select * from MyTable Order By ListOrder 

Nếu người dùng chỉ có thể di chuyển một bookmark một nơi cùng một lúc, bạn có thể sử dụng số nguyên như ListOrder, và trao đổi chúng. Ví dụ: nếu người dùng muốn di chuyển "f" lên một hàng:

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' 

Nếu người dùng có thể di chuyển dấu trang lên hoặc xuống nhiều hàng cùng một lúc, thì bạn cần phải sắp xếp lại phân đoạn. Ví dụ: nếu người dùng muốn di chuyển "f" lên đầu danh sách, bạn cần phải:

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' 
+0

Cảm ơn ý tưởng này. Tôi đoán tôi đang cố gắng xem liệu tôi có thể giải quyết vấn đề của mình mà không cần tạo ra một Coloumn mới hay không. – lucius

+0

Nhưng điều này có thể hoạt động nếu một dấu trang di chuyển nhiều hơn 1 địa điểm cùng một lúc? Ví dụ: nếu người dùng muốn di chuyển "f" từ 4 đến 2 thì sao? tất cả g, b, cần được cập nhật. – lucius

+0

Có, Đó là ví dụ thứ hai của tôi trong đoạn mã trên. –

0

Trước tiên, hãy để tôi đồng ý với mọi người ở đây rằng thứ tự trong bảng không thành vấn đề. Sử dụng cột [SortOrder] riêng biệt mà bạn cập nhật và bao gồm mệnh đề Order By.

Điều đó nói rằng, cơ sở dữ liệu SQL Server cho phép một "chỉ mục nhóm" duy nhất trên một bảng thực sự sẽ buộc vị trí trong bộ nhớ bảng bên dưới. Chủ yếu hữu ích nếu bạn có một tập dữ liệu lớn và luôn luôn truy vấn bởi một cái gì đó cụ thể.

0

Câu hỏi thiếu bất kỳ chi tiết nào sẽ cho phép bất cứ ai cung cấp cho bạn câu trả lời chính xác. Rõ ràng bạn có thể đọc các bản ghi vào bộ nhớ và sau đó cập nhật chúng. Nhưng điều này là xấu trên nhiều cấp độ khác nhau.

Vấn đề là như thế này. Tùy thuộc vào lược đồ thực sự được triển khai có logic theo cách mà các bản ghi được ghi trên đĩa vật lý. Đôi khi chúng được viết theo thứ tự chèn và các thời điểm khác chúng được chèn vào với khoảng cách giữa các khối (xem phần mở rộng).

Vì vậy, việc thay đổi thứ tự vật lý không có khả năng mà không cần trao đổi dữ liệu cột; và điều này có ảnh hưởng sâu sắc đến các chỉ số khác nhau. Bạn đang phải thay đổi thứ tự logic.

Khi tôi đọc bản cập nhật của bạn ... Tôi còn lại để hiểu rằng bạn có thể có nhiều người dùng và mỗi người dùng phải có dấu trang mà họ muốn đặt hàng. Có vẻ như bạn cần một bảng thứ hai hoạt động như một giao lộ giữa người dùng và dấu trang. Sau đó, tất cả những gì bạn cần là một sự tham gia bên trong và một trật tự.

Nhưng không có đủ thông tin để cung cấp giải pháp hoàn chỉnh.

0

Thêm một cột position vào bảng của bạn và lưu trữ dưới dạng số nguyên đơn giản.

Nếu bạn cần hỗ trợ nhiều người dùng hoặc danh sách, đặt cược tốt nhất của bạn là tạo bảng đánh dấu, bảng người dùng và bảng để liên kết chúng.

  • bookmark: id,url
  • người dùng: id,name
  • users_bookmarks: user_id, bookmark_id, position, date_created

Giả sử date_created được phổ biến khi chèn hàng bạn có thể nhận được danh sách đặt hàng thứ yếu dựa trên ngày.

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

Tôi có giải pháp cho điều này mà tôi đã sử dụng một vài lần. Tôi giữ một trường bổ sung "sort_order" trong bảng và cập nhật điều này khi sắp xếp lại. Tôi đã sử dụng điều này trong trường hợp khi tôi có một số loại container với các mặt hàng, và thứ tự của các mặt hàng nên được chỉnh sửa bên trong container. Khi sắp xếp lại, tôi chỉ cập nhật thứ tự sắp xếp cho các mục trong vùng chứa hiện tại, có nghĩa là không nhiều (thường trong thực tế chỉ một vài) hàng phải được cập nhật.

Nói tóm lại, tôi thực hiện như sau:

  1. thêm một lĩnh vực SORT_ORDER vào bảng mục
  2. khi chèn một hàng mới, tôi đặt SORT_ORDER = id
  3. khi sắp xếp lại (cần id của item để di chuyển và id của mục cần chèn sau):
    • chọn id, sắp xếp theo thứ tự từ các mục chứa container = Thứ tự ID theo sort_order
    • chia id và sắp xếp từ hàng thành hai mảng s
    • loại bỏ các id của mặt hàng đó để di chuyển từ id-list
    • chèn id của mặt hàng đó để di chuyển sau khi id của mặt hàng đó để chèn sau
    • hợp nhất danh sách các id và danh sách các SORT_ORDER vào một mảng hai chiều, như [[id, sort_order], [id2, sort_order], ...]
    • chạy update item set sort_order=SORT_ORDER where id=ID (executemany) với danh sách sáp nhập

(Nếu di chuyển mục để chứa khác, sau khi cập nhật "container nước ngoài chìa khóa" di chuyển đầu tiên hoặc cuối cùng phụ thuộc vào ứng dụng.)

(Nếu bản cập nhật liên quan đến một số lượng lớn các mặt hàng, tôi không nghĩ rằng giải pháp này là một phương pháp tốt.)

Tôi đã thực hiện một ví dụ sử dụng python và mysql trên http://wannapy.blogspot.com/2010/11/reorder-rows-in-sql-database.html (sao chép và thử nó) cùng với một số giải thích thêm.

-3

Nếu bạn muốn sắp xếp các bản ghi trong bảng theo nhu cầu cụ thể của bạn và khi bạn không có lĩnh vực trật tự cho các bản ghi trong bảng, bạn có thể thử các tùy chọn sau đây:

  1. mở bạn schema cơ sở dữ liệu/cơ sở dữ liệu sử dụng trình biên tập cóc
  2. Xuất bảng bạn muốn bằng định dạng excel bằng tùy chọn xuất khẩu cóc
  3. Thực hiện bất kỳ thay đổi nào bạn muốn thực hiện trong xuất excel. Nó khá đơn giản để sắp xếp lại các hàng trong excel.
  4. Lưu excel và impport lại vào bảng bằng tùy chọn nhập dữ liệu.

get cóc: http://www.quest.com/toad-for-mysql/

+0

Điều này vô dụng đối với hành động của người dùng và không phải là ý tưởng hay (xem khá nhiều câu trả lời khác) –

-1

NẾU bạn có một cột số (id hàng, id giao dịch, vv) và đây là những gì bạn đang mong đợi để được sắp xếp, làm cho cột đó một khóa chính sẽ giải quyết phân loại vấn đề mà không cần chạy báo cáo cập nhật hoặc truy vấn bảng.

Các vấn đề liên quan