Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

thứ tự sql phức tạp của

Tôi đoán rằng "id trả lời" là 0 cho các bài báo và là số bài báo cho các nhận xét. Nếu đó là thiết kế của bạn, điều này sẽ hoạt động:

select * from yourTable
order by
  case when "reply id" = 0 then id else "reply id" end, id

ĐÃ THÊM: Cảm ơn thông tin bổ sung trong bình luận của bạn. Để sắp xếp các kết quả theo thứ tự bạn muốn không phải dễ dàng như vậy, bởi vì khóa sắp xếp đầu tiên là ngày tạo của bài đăng bắt đầu luồng. Đây không phải là hàng dữ liệu, vì vậy bạn cần một phép nối. Đây là phỏng đoán tốt nhất của tôi dựa trên thông tin bổ sung (vẫn chưa đủ đầy đủ để giúp tôi không phải đoán):

select
  f.id, f.user_id, f.type, f.reply_id, f.text, f.url, f.created_date,
  coalesce(parentfeed.created_date,f.created_date) as thread_date
from feed as f left outer join feed as parentfeed
on f.reply_id = parentfeed.id
order by
  thread_date desc,
  case when f.reply_id = 0 then 0 else 1 end,
  created_date desc, id;

Bạn có thể cần phải điều chỉnh cú pháp cho postgre. Tôi đã kiểm tra điều này trong SQL Server.

Nếu điều này vẫn không thực hiện những gì bạn muốn, vui lòng nói cụ thể về cách bạn muốn lấy lại dữ liệu. Tốt hơn là hãy cho tôi biết thứ tự "id" mà tôi sẽ thấy đối với dữ liệu trong tệp kết xuất của bạn và cả giải thích cơ sở cho đơn đặt hàng đó. Đây là những gì tôi đã làm:

  1. Tất cả các bài viết trong một chuỗi (chuỗi =một bài viết và các nhận xét của nó) phải được nhóm lại với nhau.

  2. Trong một chuỗi, hãy đặt thông báo lên đầu, sau đó là nhận xét của nó theo thứ tự thời gian ngược lại. Chuỗi có / _date được tạo gần đây nhất phải đứng đầu tiên, sau đó là chuỗi có ngày tạo_date gần đây nhất thứ hai, v.v. (Dữ liệu mẫu của bạn có nhiều nhận xét với cùng ngày tạo, vì vậy tôi đã sử dụng "id" làm khóa thứ tự phụ cho các nhận xét trong một chuỗi.)

Lưu ý: Kết xuất của bạn cho biết rằng ngày tạo được cập nhật thành CURRENT_TIMESTAMP nếu một bài đăng được sửa đổi. Nếu đây là một bảng tin trực tiếp, hãy lưu ý rằng điều này có thể khiến các nhận xét bị trùng ngày trước thông báo chính, và nó có nghĩa là một chuỗi sẽ ở trên cùng nếu nó thường xuyên được sửa đổi (ngay cả khi không có thay đổi thực sự nào đối với văn bản của nó). (Điều đó không liên quan đến giải pháp của tôi, nhưng tôi nghĩ nó đáng chú ý.)

Bởi vì một kết nối là bắt buộc, truy vấn này bây giờ sẽ chậm hơn nhiều. Đề xuất của tôi:duy trì hai cột ngày, "thread_last_modified" và "item_last_modified". Bạn sẽ phải phân tầng các bản cập nhật từ trình bắt đầu luồng đến nhận xét, nhưng tôi nghĩ sẽ đáng giá nếu không có nhiều bản cập nhật, vì truy vấn có thể đơn giản hơn nhiều. Tôi chưa kiểm tra điều này vì nó yêu cầu một số thay đổi đối với thiết kế của bạn:

select
  id, user_id, type, reply_id, text, url, thread_last_modified, item_last_modified
from feed
order by
  thread_last_modified desc,
  case when f.reply_id = 0 then 0 else 1 end,
  item_last_modified desc, id;

ĐÃ THÊM # 2 :Nếu bạn chỉ muốn chuỗi chứa nhận xét có id ::thisOne, tôi nghĩ bạn có thể thêm dòng này vào giữa mệnh đề BẬT và ĐẶT HÀNG BẰNG (đối với giải pháp được thêm đầu tiên của tôi, phép nối):

where parentfeed.id = (
  select coalesce(reply_id,id)
  from feed
  where id = ::thisOne
)

Về lý thuyết, tra cứu này chỉ nên được đánh giá một lần cho truy vấn, nhưng nếu không phải trong thực tế, bạn có thể tính toán trước nó thành ::thisOneThreadID và thêm

where parentfeed.id = ::thisOneThreadID

Đối với giải pháp thứ hai, giả sử bạn tính toán trước một lần nữa, hãy thử

where coalesce(id,reply_id) = ::thisOneThreadID

Nhân tiện, tôi nghi ngờ cả hai giải pháp của tôi sẽ hợp nhất các chủ đề được sửa đổi lần cuối vào cùng một thời điểm ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. drupal mệnh đề điều kiện sql cho nhiều bảng?

  2. Truy vấn MySQL để tính toán Tháng trước

  3. chèn dữ liệu từ JSON vào mysql bằng php

  4. Tại sao tôi không thể chèn vào MySQL?

  5. Không thể truy xuất giá trị tôi muốn Chọn bằng Quy trình đã Lưu trữ