sách gpt4 ăn đã đi

ORDER BY áp dụng trước hay sau DISTINCT? (ORDER BY áp dụng trước hay sau DISTINCT?)

In lại Tác giả: trợ lý lỗi Thời gian cập nhật: 22-10-2023 14:29:47 34 4
mua khóa gpt4 giày nike



Trong truy vấn MySQL, khi sử dụng RIÊNG BIỆT tùy chọn, làm ĐẶT HÀNG THEO áp dụng sau khi các bản sao được xóa? Nếu không, có cách nào để thực hiện không? Tôi nghĩ nó đang gây ra một số vấn đề với mã của tôi.

Trong truy vấn MySQL, khi sử dụng tùy chọn DISTINCT, ORDER BY có được áp dụng sau khi xóa các bản sao không? Nếu không, có cách nào để làm điều này? Tôi nghĩ điều này đang gây ra một số vấn đề với mã của tôi.



BIÊN TẬP:

Sau đây là một số thông tin thêm về nguyên nhân gây ra sự cố của tôi. Tôi hiểu rằng, thoạt nhìn, thứ tự này sẽ không quan trọng, vì tôi đang xử lý các hàng trùng lặp. Tuy nhiên, không hoàn toàn như vậy, vì tôi đang sử dụng NỐI BÊN TRONG để sắp xếp các hàng.

EDIT: Đây là một số thông tin thêm về vấn đề của tôi. Tôi biết, thoạt nhìn, thứ tự không quan trọng vì tôi đang xử lý các hàng trùng lặp. Tuy nhiên, điều này không hoàn toàn đúng vì tôi đang sử dụng INNER JOIN để sắp xếp các hàng.



Giả sử tôi có một bảng các chủ đề diễn đàn, chứa dữ liệu này:

Giả sử tôi có một bảng các chủ đề diễn đàn với dữ liệu sau:



+----+-------+-------------+
| id | id người dùng | tiêu đề |
+----+-------+-------------+
| 1 | 1 | Thông tin |
| 2 | 1 | Câu hỏi thường gặp |
| 3 | 2 | Hỗ trợ |
+----+-------+-------------+


Tôi cũng có một tập hợp các bài đăng trong một bảng khác như thế này:

Tôi cũng có một tập hợp các bài viết trong một bảng khác như thế này:



+----+----------+--------+----------+
| id | threadid | userid | nội dung |
+----+----------+--------+----------+
| 1 | 1 | 1 | Chào mừng |
| 2 | 1 | 2 | Rất |
| 3 | 2 | 2 | Kiểm tra |
| 4 | 3 | 1 | Đồ ăn |
| 5 | 2 | 3 | Quán bar |
| 6 | 3 | 5 | Bob |
| 7 | 1 | 2 | Joe |
+----+----------+--------+----------+


Tôi đang sử dụng truy vấn MySQL sau để lấy tất cả các chủ đề, sau đó sắp xếp chúng dựa trên bài đăng mới nhất (giả sử các bài đăng có id cao hơn là mới hơn:

Tôi sử dụng truy vấn MySQL sau để lấy tất cả các chủ đề và sau đó sắp xếp chúng dựa trên bài đăng mới nhất (giả sử các bài đăng có id cao hơn là mới hơn:



CHỌN t.*
TỪ Chủ đề t
INNER JOIN Bài viết p TRÊN t.id = p.threadid
SẮP XẾP THEO p.id DESC


Cách này có hiệu quả và tạo ra nội dung tương tự như sau:

Điều này hoạt động và tạo ra một cái gì đó như thế này:



+----+-------+-------------+
| id | id người dùng | tiêu đề |
+----+-------+-------------+
| 1 | 1 | Thông tin |
| 3 | 2 | Hỗ trợ |
| 2 | 1 | Câu hỏi thường gặp |
| 3 | 2 | Hỗ trợ |
| 2 | 1 | Câu hỏi thường gặp |
| 1 | 1 | Thông tin |
| 1 | 1 | Thông tin |
+----+-------+-------------+


Tuy nhiên, như bạn thấy, thông tin là đúng, nhưng có những hàng trùng lặp. Tôi muốn xóa những hàng trùng lặp như vậy, vì vậy tôi đã sử dụng CHỌN RIÊNG BIỆT thay vào đó. Tuy nhiên, điều này mang lại kết quả sau:

Tuy nhiên, như bạn có thể thấy, thông tin đúng nhưng có những hàng trùng lặp. Tôi muốn loại bỏ những nội dung trùng lặp như thế này nên tôi đã sử dụng SELECT DISTINCT. Tuy nhiên, điều này đã tạo ra kết quả sau:



+----+-------+-------------+
| id | id người dùng | tiêu đề |
+----+-------+-------------+
| 3 | 2 | Hỗ trợ |
| 2 | 1 | Câu hỏi thường gặp |
| 1 | 1 | Thông tin |
+----+-------+-------------+


Điều này rõ ràng là sai, vì luồng "Thông tin" phải ở trên cùng. Có vẻ như việc sử dụng RIÊNG BIỆT khiến các bản sao bị xóa từ trên xuống dưới, do đó chỉ còn lại các hàng cuối cùng. Điều này gây ra một số vấn đề trong quá trình sắp xếp.

Điều này rõ ràng là sai vì chuỗi "Thông tin" phải ở trên cùng. Việc sử dụng DISTINCT dường như khiến các bản sao bị xóa từ trên xuống dưới nên chỉ còn lại hàng cuối cùng. Điều này có thể gây ra một số vấn đề trong việc sắp xếp.



Có phải vậy không, hay là tôi đang phân tích sự việc không đúng?

Điều này đúng hay tôi đang phân tích sai?


Thêm câu trả lời

Bạn nghĩ nó đang gây ra vấn đề gì? Nó sẽ tạo ra sự khác biệt gì?

Bạn nghĩ điều này có thể gây ra vấn đề gì? Điều này sẽ tạo ra sự khác biệt gì?

tại sao điều đó lại quan trọng? trước hoặc sau khi áp dụng distinct, thứ tự phải giống nhau

Tại sao điều này lại quan trọng? Thứ tự phải giống nhau trước hoặc sau khi áp dụng riêng biệt

Bạn có thể cho chúng tôi xem ví dụ về truy vấn bạn đang thử và vấn đề thực tế bạn đang gặp phải không?

Bạn có thể cho chúng tôi xem truy vấn mẫu về những gì bạn đang cố gắng và vấn đề thực tế bạn đang gặp phải không?

@bfrohs - Với tôi thì không có ý nghĩa gì cả. Bạn sẽ nhận được kết quả tương tự nếu bạn sắp xếp các hàng trước rồi xóa các mục trùng lặp thay vì xóa các mục trùng lặp trước rồi mới sắp xếp những mục còn lại.

@bfrohs - không có ý nghĩa gì với tôi. Nếu bạn sắp xếp các hàng trước rồi loại bỏ các hàng trùng lặp, thay vì trước tiên loại bỏ các hàng trùng lặp rồi sắp xếp phần còn lại, bạn sẽ nhận được kết quả tương tự.

@bfrohs, nhưng với DISTINCT bạn sẽ nhận được (1:a;1:c;2:b).

@bfrohs, nhưng với DISTINCT bạn nhận được (1:a; 1:c; 2:b).

Khuyến nghị câu trả lời tuyệt vời

Có hai điều cần hiểu:

Cần phải hiểu hai điều:



  1. Nói chung, các tập kết quả là không có thứ tự trừ khi bạn chỉ định một ĐẶT HÀNG THEO điều khoản; trong phạm vi mà bạn chỉ định một thứ tự không nghiêm ngặt (tức là ĐẶT HÀNG THEO trên các cột không duy nhất), thứ tự mà các bản ghi giống nhau theo thứ tự đó xuất hiện trong tập kết quả là không xác định.


    Tôi nghi ngờ bạn có thể đang chỉ định một thứ tự không nghiêm ngặt như vậy, đó là gốc rễ của vấn đề của bạn: hãy đảm bảo rằng thứ tự của bạn là nghiêm ngặt bằng cách chỉ định ĐẶT HÀNG THEO trên một tập hợp các cột đủ để xác định duy nhất từng bản ghi mà bạn quan tâm về vị trí cuối cùng của nó trong tập kết quả.



  2. RIÊNG BIỆT có thể sử dụng NHÓM THEO, điều này khiến cho kết quả được sắp xếp theo các cột được nhóm; nghĩa là, CHỌN DISTINCT a, b, c TỪ t sẽ tạo ra một tập kết quả xuất hiện như thể SẮP XẾP THEO a, b, c đã được áp dụng. Một lần nữa, việc chỉ định một thứ tự đủ nghiêm ngặt để đáp ứng nhu cầu của bạn sẽ ghi đè lên hiệu ứng này.






Sau khi bạn cập nhật, hãy ghi nhớ điểm số 2 của tôi ở trên, rõ ràng là hiệu ứng của việc nhóm các kết quả để đạt được RIÊNG BIỆT làm cho việc sắp xếp theo cột không được nhóm trở nên không thể Mã số nhận dạng; thay vào đó, bạn muốn:

Dựa trên bản cập nhật của bạn, hãy ghi nhớ quan điểm 2 của tôi ở trên, rõ ràng rằng việc nhóm các kết quả để đạt được hiệu quả của DISTINCT sẽ ngăn bạn sắp xếp theo cột chưa được nhóm p.id thay vào đó, bạn muốn:


CHỌN t.*
TỪ Luồng t NỘI TRONG JOIN Bài viết p TRÊN t.id = p.threadid
NHÓM THEO t.id
SẮP XẾP THEO MAX(p.id) DESC


RIÊNG BIỆT thông báo cho MySQL cách xây dựng một rowset cho bạn, ĐẶT HÀNG THEO đưa ra gợi ý về cách mà rowset này nên được trình bày. Vì vậy, câu trả lời là: RIÊNG BIỆT Đầu tiên, ĐẶT HÀNG THEO cuối cùng.

DISTINCT cho MySQL biết cách xây dựng tập hợp hàng cho bạn và ORDER BY sẽ nhắc cách trình bày tập hợp hàng đó. Vì vậy, câu trả lời là: phân biệt trước, sau đó sắp xếp.



Thứ tự mà RIÊNG BIỆTĐẶT HÀNG THEO được áp dụng trong hầu hết các trường hợp sẽ không ảnh hưởng đến kết quả cuối cùng.

Trong hầu hết các trường hợp, thứ tự áp dụng DISTINCT và ORDERBY không ảnh hưởng đến kết quả cuối cùng.



Tuy nhiên, nếu bạn cũng sử dụng NHÓM THEO, cái này sẽ ảnh hưởng đến kết quả đầu ra cuối cùng. Trong trường hợp này, ĐẶT HÀNG THEO được thực hiện sau đó cái NHÓM THEO, điều này sẽ trả về kết quả không mong muốn (giả sử bạn mong đợi việc sắp xếp được thực hiện trước khi nhóm).

Tuy nhiên, nếu bạn cũng sử dụng GROUP BY, điều này sẽ ảnh hưởng đến kết quả cuối cùng. Trong trường hợp này, ORDER BY được thực hiện sau GROUP BY, điều này sẽ trả về kết quả không mong muốn (giả sử bạn muốn thực hiện sắp xếp trước khi nhóm).



trong Mysql, RIÊNG BIỆT chạy đầu tiên, và sau đó đặt hàng theo chạy trên bảng dữ liệu được chọn bởi RIÊNG BIỆT.

Trong Mysql, DISTINCT được chạy trước rồi mới chạy tuần tự trên các bảng dữ liệu do DISTINCT chọn.


để hiểu rõ hơn hãy truy cập: leetcode: Mức lương cao thứ N

Để hiểu rõ hơn hãy truy cập: leetcode: Mức lương cao nhất thứ N


Thêm câu trả lời

Tuyệt vời, cảm ơn, nó hoạt động. Vậy, chỉ để xác nhận, TỐI ĐA() so sánh sử dụng giá trị lớn nhất của Mã số nhận dạng trong mỗi nhóm?

Tuyệt vời, cảm ơn bạn, nó thực sự hiệu quả. Vì vậy, chỉ để xác nhận, MAX() sử dụng giá trị tối đa của p.id trong mỗi nhóm để so sánh?

Nhưng thực tế là, RIÊNG BIỆT được thực hiện bằng cách sắp xếp kết quả... do đó có lẽ không nếu trình tối ưu hóa sử dụng cùng một thứ tự cho cả hai tác vụ.

Tuy nhiên, trên thực tế, DISTINCT được thực hiện bằng cách sắp xếp kết quả. . . Vì vậy, nếu trình tối ưu hóa sử dụng cùng một thứ tự cho cả hai tác vụ thì có thể không.

Trong trường hợp này, như eggyval chỉ ra, có một ngoại lệ. Khi DISTINCT được nhóm với ORDER BY, nó sẽ thực hiện sắp xếp (filesort) trước.

Trong trường hợp này, như eggyval đã chỉ ra, có một ngoại lệ. Khi DISTINCT được nhóm với ORDERBY, nó sẽ được sắp xếp trước (sắp xếp tệp).

RIÊNG BIỆT có thể sử dụng NHÓM THEO. Thực hiện lệnh gì trước nhóm thực hiện được điều mà việc thực hiện sau đó không làm được (lưu ý rằng việc chọn các cột chưa nhóm mà không có hàm tổng hợp sẽ dẫn đến kết quả không xác định - dù sao thì cũng không liên quan trong trường hợp này vì RIÊNG BIỆT đảm bảo không có cột nào như vậy tồn tại)?

DISTINCT có thể sử dụng NHÓM THEO. Việc thực hiện sắp xếp trước khi nhóm sẽ đạt được điều gì và thực hiện sắp xếp sau khi nhóm sẽ không đạt được (hãy nhớ rằng việc chọn một cột chưa được nhóm mà không có hàm tổng hợp sẽ dẫn đến kết quả không xác định - dù sao cũng không liên quan trong trường hợp này, vì DISTINCT đảm bảo rằng không có cột như vậy tồn tại)?

@eggyal, vấn đề không phải ở RIÊNG BIỆT, nhưng với NHÓM THEOĐẶT HÀNG THEO. Nếu các hàng được nhóm lại nhưng không được chọn, RIÊNG BIỆT không giúp ích gì cả và truy vấn có thể trả về các giá trị hàng "sai" (ví dụ: nhận dạng, sau đó được sử dụng để lấy giá trị).

@eggyal, vấn đề không nằm ở DISTINCT, mà là ở GROUP BY và ORDER BY. Nếu các hàng được nhóm nhưng không được chọn, DISTINCT không giúp ích gì và truy vấn có thể trả về giá trị hàng "sai" (ví dụ: id được sử dụng để truy xuất giá trị sau này).

34 4 0
trợ lý lỗi
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress