2015-05-20 18 views
6

Có hai loại kết quả tôi muốn quay trở lại:truy vấn SQL để chọn tối thiểu 10 kết quả

  • Thông báo chưa đọc
  • đọc thông báo

Nếu có> 10 thông báo chưa đọc sẵn tôi muốn chọn bao nhiêu là có

Nếu có < = 10, tôi muốn chọn tất cả (nói có 7) thông báo chưa đọc và 3 'bộ nạp' không đọc tifications. Làm thế nào tôi có thể thực hiện điều này?

Nếu tôi muốn chỉ cần chọn tất cả các thông báo chưa đọc truy vấn của tôi sẽ là:

SELECT * FROM notifications WHERE read = 0 

Nếu tôi muốn chỉ cần chọn tất cả các thông báo đọc truy vấn của tôi sẽ là:

SELECT * FROM notifications WHERE read = 1 

Trả lời

5

này sẽ giúp bạn: http://sqlfiddle.com/#!9/e7e2a/2

SELECT * FROM 
(
    SELECT @rownum := @rownum + 1 AS rownum, name, read 
    FROM notifications, 
    (SELECT @rownum := 0) r --initialise @rownum to 0 
) t 
WHERE read = 0 OR (read = 1 AND rownum <= 10) 
ORDER BY rownum 

Các hồ sơ được đánh số với @rownum. Mệnh đề where đảm bảo rằng read = 0 được chọn đầu tiên. Nếu họ lên đến 10 người trở lên, tất cả đều được chọn. Nhưng nếu không, tiêu chí thứ hai (read = 1 AND rownum <= 10) sẽ được chọn.

(SELECT @rownum := 0) r initialises @rownum-0 nếu không nó sẽ NULLNULL+1=NULL

enter image description here

+0

Bạn có thể giải thích những gì đang xảy ra ở đây không ít? Riêng r <= 10 và (SELECT @rownum: = 0) r – maxhud

+0

Cảm ơn lời giải thích! Câu trả lời chính xác. – maxhud

+0

Tất cả các hàng được đánh số, bắt đầu từ hàng chưa đọc đến đọc. Nếu chưa đọc> = 10, thì tất cả chưa đọc được chọn. Nếu chưa đọc <10, việc đánh số tiếp tục vào các hàng đã đọc, nhưng chúng tôi chỉ muốn các hàng được đánh số <= 10 – codingbiz

5

gì bạn có thể làm là kết hợp hai kết quả, theo thứ tự quan trọng nhất và sau đó giới hạn Liên minh:

SELECT Col1, Col2, ... 
FROM 
(
    SELECT Col1, Col2, `read`, ... FROM notifications WHERE read = 0 
    UNION 
    SELECT Col1, Col2, `read`, ... FROM notifications WHERE read = 1 
) x 
ORDER BY x.`read` -- And probably a column like Time? 
LIMIT 10; 

SqlFiddle here

Chỉnh sửa, Re: Phải trở ALL chưa đọc, không chỉ đầu tiên 10

Xin lỗi, tôi đã bỏ lỡ một phần của câu hỏi. Tôi không thể nghĩ ra một cách thanh lịch để đạt được điều này, vì vậy đây là một giải pháp một phần nằm trong một thủ tục bắt buộc và một bảng tạm thời để lấp đầy các hàng, nếu cần: sử dụng giải pháp của codingbiz cho đến khi MySql hỗ trợ chức năng Windowing (ví dụ ROW_NUMBER() OVER (PARTITION BY read ORDER BY Col1 DESC)

+4

Sẽ không chỉ trở lại này 10 kết quả nếu có 15 thông báo chưa đọc? – maxhud

+0

Vâng, điều này không đúng. Nếu có, nó có thể được viết đơn giản hơn nhiều. – Strawberry

+0

Có, cả hai điểm tốt - [Strawberry] (http://sqlfiddle.com/#!9/494df/4) và vẫn đang làm việc với sự cố ALL hoặc Max10. Tôi không thể nhìn thấy một giải pháp không bắt buộc tuy nhiên: ( – StuartLC

0

Nếu bảng không nhận được để lớn bạn có thể thử tham gia như sau

SELECT *, 
    ROW_NUMBER() OVER (
     ORDER BY read 
    ) AS RowNum 
FROM (
    SELECT * FROM notifications WHERE read = 0 
    UNION 
    SELECT * FROM notifications WHERE read = 1 

) T1 
WHERE T1.read = 0 OR (T1.read = 1 AND T1.RowNum <= 10) 
ORDER BY T1.read DESC 

Khi các bảng làm được lớn, bạn có thể thử để chạy một số trên bảng 'đọc' đầu tiên và thấy nếu nó có hơn 10 thư chưa đọc và dựa trên kết quả đó, hãy chọn thư đã đọc hoặc chưa đọc

INT @readMessages = SELECT COUNT(*) FROM notifications WHERE read = 0 

SELECT CASE 
    WHEN @readMessages > 10 THEN SELECT * FROM notifications WHERE read = 0 
    ELSE (
     SELECT * FROM notifications WHERE read = 0 
     UNION 
     SELECT * FROM notifications WHERE read = 1 LIMIT 0, [email protected] 
    ) 

Không biết nếu đó là tất cả cú pháp MySQL thích hợp (nhiều hơn một anh chàng SQL), nhưng có lẽ nó sẽ giúp bạn.

+2

Không có' ROW_NUMBER() 'trên MySQL – sqluser

+0

tìm thấy điều này: http://blog.sqlauthority.com/ 2014/03/08/mysql-generated-row-number-for-each-row-sử dụng-biến/ SET \ @row_number: = 0; SELECT *, \ @row_number: = \ @ row_number + 1 AS ROWNUM TỪ ( SELECT * FROM thông báo ĐÂU đọc = 0 UNION SELECT * FROM thông báo ĐÂU đọc = 1 ) T1 ĐÂU T1.read = 0 HOẶC (T1.read = 1 AND T1.RowNum <= 10) ĐƠN HÀNG ĐẶT HÀNG T1.đã đọc DESC Xin lỗi vì \ @, nhưng người nào khác nghĩ rằng tôi đang tham chiếu đến người dùng – Rik

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