2009-06-09 25 views
8

Giả sử tôi có bảng MySQL, people. Mỗi bản ghi bao gồm nhiều thuộc tính, trong số này là favourite_colour, countryage_group.Truy xuất bản ghi MySQL dựa trên tập hợp các điểm so sánh

Điều tôi muốn làm là truy xuất các bản ghi từ bảng này bằng sự giống nhau của chúng với một tập hợp các thông số cụ thể. Ví dụ: Ví dụ: "Đỏ", "Hoa Kỳ" và "18-25", kết quả tốt nhất sẽ là các bản ghi phù hợp với cả ba. Đây sẽ là 100% phù hợp.

Tuy nhiên, tôi cũng muốn truy xuất các bản ghi khớp với bất kỳ kết hợp nào của hai tham số (66% đối sánh) hoặc bất kỳ tham số nào (đối sánh 33%). Hơn nữa, tôi muốn có thể xác định các điểm so sánh bổ sung (ví dụ: underwear_type, marital_status, v.v.).

Có giải pháp tương đối hiệu quả nào cho vấn đề này không?

Trả lời

11

Vâng, bạn có thể biến mỗi so sánh, chẳng hạn như favourite_colour='Red' & c, thành một giá trị từ 0 (false) hoặc 1 (true) - mysql sẽ làm điều đó mặc nhiên, nhưng đối với tính tổng quát bạn có thể muốn CAST((favourite_colour='Red') AS INTEGER) & c; sau đó, bạn SUM tất cả những điều này, tức là,

SELECT 
userId, 
SUM((favourite_colour='Red'), 
    (country='US'), 
    (age_group='18-25')) AS match_score 
FROM people 
WHERE match_score >= 2 
ORDER BY match_score DESC 

sẽ cung cấp cho bạn kết quả phù hợp trước tiên, 2-của-3 tiếp theo; dễ dàng để khái quát hóa để kiểm tra nhiều hơn nữa! -)

+0

Điều này khá thông minh! –

+0

Đây thực sự là một ý tưởng rất hay. Nó sẽ dễ dàng để thêm trọng lượng này quá bằng cách nhân một trong các kết quả. –

+0

Đây thực sự là một giải pháp tuyệt vời. Một vài lưu ý/câu hỏi: từ những gì tôi có thể nói, SQL không cho phép các bí danh cột (ví dụ match_score) trong mệnh đề WHERE. Ngoài ra, tôi không nghĩ SUM() hoạt động như truy vấn của bạn sẽ gợi ý (nó không chấp nhận nhiều đối số); Tài liệu của MySQL cho biết SUM() chỉ là một hàm tổng hợp GROUP BY. Loại bỏ mệnh đề WHERE và thay thế tổng bằng các toán tử bổ sung đã làm cho hàm hoạt động như một sự quyến rũ. –

0

Trong ba đầu tiên là dễ dàng:

select * from people 
where 
(case when color = 'Red' then 33 else 0 end + 
case when age_group = '18-25' then 33 else 0 end + 
case when country = 'United States' then 33 else 0 end)>=33 

Tôi không hiểu được "thêm điểm so sánh" một phần, bạn có thể giải thích?

+0

Đây không phải là rất có thể sử dụng hoặc thanh lịch. –

+0

So với giải pháp của Alex, tôi phải đồng ý !. Nhưng nó vẫn hoạt động. – tekBlues

+0

Đó là lý do tại sao StackOverflow ở đây :) để tìm giải pháp tốt nhất. –

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