Tôi hiện đang viết một ứng dụng web phù hợp với người dùng dựa trên câu hỏi được trả lời. Tôi đã nhận ra thuật toán đối sánh của tôi chỉ trong một truy vấn và đã điều chỉnh nó cho đến giờ phải mất 8,2ms để tính toán tỷ lệ phần trăm phù hợp giữa 2 người dùng. Nhưng webapp của tôi phải lấy danh sách người dùng và lặp qua danh sách thực hiện truy vấn này. Đối với 5000 người dùng, nó mất 50 giây trên máy cục bộ của tôi. Có thể đặt mọi thứ trong một truy vấn trả về một cột với cột user_id và một cột có đối sánh được tính không? Hoặc là một thủ tục lưu trữ một tùy chọn?SQL: trả về bảng người dùng với cột được tính toán cho phần trăm so khớp?
Tôi hiện đang làm việc với MySQL nhưng sẵn sàng chuyển đổi cơ sở dữ liệu nếu cần.
Đối với bất cứ ai quan tâm đến các lược đồ và dữ liệu, tôi đã tạo ra một SQLFiddle: http://sqlfiddle.com/#!2/84233/1
và truy vấn phù hợp với tôi:
SELECT COALESCE(SQRT((100.0*as1.actual_score/ps1.possible_score) * (100.0*as2.actual_score/ps2.possible_score)) - (100/ps1.commonquestions), 0) AS perc
FROM (SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 101
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 1) AS as1,
(SELECT SUM(value) AS possible_score, COUNT(*) AS commonquestions
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 101
WHERE uq1.user_id = 1) AS ps1,
(SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 1
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 101) AS as2,
(SELECT SUM(value) AS possible_score
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 1
WHERE uq1.user_id = 101) AS ps2
Bạn có thể kết hợp biểu thức phụ "câu hỏi thường gặp" của hai "chân" của truy vấn. Bạn cũng có thể khái quát hóa các truy vấn phụ cho người dùng = 1 và người dùng = 101 thành một truy vấn CTE tổng quát (nếu DBMS của bạn hỗ trợ chúng. Nhưng trước tiên: Hãy hiển thị cho chúng tôi định nghĩa bảng và có thể một số dữ liệu. – wildplasser
Có, dữ liệu với đầu ra mong muốn tương ứng –
Tôi đã tạo một SQLFiddle để chơi với :) Khi tôi kết hợp người dùng 1 và 5, kết quả sẽ là '43 .678 'http://sqlfiddle.com/#!2/84233/1 – Mexxer