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

mysql phức tạp sql

Đây là một ví dụ khác về bản ghi TOP X trên ví dụ Y. Đối với mỗi câu hỏi, bạn muốn có 4 câu trả lời. LIMIT thực sự cần thiết.

Vì vậy, cách tiếp cận của tôi là áp dụng ngẫu nhiên với các câu hỏi trước để lấy kết quả đó dưới dạng kết quả tập hợp con, sau đó nối kết quả đó với các câu trả lời và giới hạn X trên mỗi Y. VẬY, chúng ta có thể tóm gọn tất cả. Điều quan trọng ở đây là truy vấn bên trong phải được sắp xếp theo thứ tự của ID câu hỏi ... VÀ vòng loại, câu trả lời "Đúng" luôn ở vị trí đầu tiên, nhưng bất kỳ thứ gì sau đó đều được ngẫu nhiên hóa để bao gồm tổng cộng 4 bản ghi.

Sau đó, truy vấn cuối cùng áp dụng mệnh đề WHERE để chỉ bao gồm vị trí trình tự xếp hạng là <=4 (có thể có tất cả 9 câu trả lời được bao gồm cho 1 câu hỏi, nhưng sau đó áp dụng mệnh đề cuối cùng "ORDER BY" để giữ các câu hỏi cùng nhau, nhưng ngẫu nhiên các câu trả lời để "Đúng" không còn được trả lại ở vị trí đầu tiên. Bạn có thể xóa mệnh đề "ORDER BY" bên ngoài này cho mục đích thử nghiệm chỉ để xác nhận chức năng, sau đó thêm lại vào sau.

select
      FinalQA.*
   from
      ( select 
              QWithAllAnswers.*,
              @RankSeq := if( @LastQuestion = QWithAllAnswers.id, @RankSeq +1, 1 ) ARankSeq,
              @LastQuestion := QWithAllAnswers.id as ignoreIt
           from
              ( SELECT 
                      q.id,
                      q.question,
                      q.RandQuestionResult,
                      a.question_id,
                      a.answer, 
                      a.correct
                   FROM 
                      ( SELECT q.ID,
                               q.Question,
                               q.question_ID,
                               RAND() as RandQuestionResult
                           FROM 
                               questions q 
                           WHERE 
                               q.subject_id = 18 
                           ORDER BY RAND() 
                           LIMIT 5) JustQ
                      JOIN answers a 
                         on q.id = a.question_id
                   ORDER BY
                      JustQ.RandQuestionResult,
                      if( a.correct = 1,0.000000, RAND() 
              ) QWithAllAnswers,

              ( select @RankSeq := 0, @LastQuestion := 0 ) SQLVars

      ) FinalQA

   where
      FinalQA.ARankSeq < 5
   order by
      FinalQA.RandQuestionResult,
      rand()

Vài thay đổi nhỏ ... Đảm bảo tại SQLVars:= cho mỗi nhiệm vụ. Khi tôi đăng ban đầu, tôi đã bỏ đi một ":" có thể gây ra lỗi sai. Tôi cũng đủ điều kiện cho "Order by" bên trong bằng cách sử dụng "a.correct =1" (không có tham chiếu bí danh). Cuối cùng, thay đổi mệnh đề WHERE bên ngoài thành chỉ < 5 thay vì <= 4 . Tôi đã thực hiện NHIỀU nhóm X trên Y tuyệt vời nhất này và biết rằng chúng hoạt động, tôi chắc chắn chỉ thiếu một cái gì đó đơn giản.

Ngoài ra, đã điều chỉnh IF() ngẫu nhiên để có giá trị đầu tiên dưới dạng số thập phân, nếu không tất cả các ngẫu nhiên được đặt thành 1 (số nguyên) và không bao giờ là phân số ... Ngoài ra, đối với các vấn đề có thể xảy ra khi áp dụng LỆNH, tôi đã truy vấn trước tất cả Q và A đã được sắp xếp trước để nhận được tất cả các câu trả lời Đúng ở vị trí đầu tiên, SAU ĐÓ áp dụng SQLVars so với tập hợp đó, sau đó hoàn thiện trình tự xếp hạng và sắp xếp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Go SQL driver get giao diện {} giá trị cột

  2. Các bảng cơ sở dữ liệu động trong django

  3. Giải quyết vấn đề SQLinjection

  4. Nhận một mục từ một chuỗi danh sách trong MySQL

  5. MySQL chọn ngày được định dạng từ trường mili giây