2011-06-29 38 views
5

Tôi có hai bảng, ngày 1:MySQL mối quan hệ truy vấn

users(id,name, birth_date) 
skills(user_id,skill_name,skill_level) 

Tôi muốn chọn tất cả các người dùng với 3 một số kỹ năng về mức độ 2.

làm có thể của nó này trong một truy vấn?

dụ:

user has 
3,marcus,19/03/1989 
4,anderson,08/02/1990 

skills has 
3,php,2 
3,html,1 
4,php,1 

những gì tôi muốn là: tất cả người dùng có php 2 VÀ html 1.

+0

Có thể, nhưng không rõ là bạn muốn xem điều gì kết quả. – Nightwolf

+1

tôi nghĩ lần này khá đơn giản để hiểu câu hỏi. Không giống như nhiều người dùng rep 1 khác – dynamic

+0

nevermind có vẻ như anh ta đã hoàn toàn thay đổi câu hỏi của mình .. doh .. – dynamic

Trả lời

4
select * 
    from users u join skills s on u.id=s.user_id 
    where skill_level=2 
    group by id 
    having count(*)>2 
+0

dòng thứ hai phải có id, không phải trong: từ người dùng u tham gia các kỹ năng trên u.id = s.user_id – Andrew

+0

typo^_ ^. ..... – dynamic

1

Được rồi. Bây giờ bạn đã cập nhật câu hỏi của mình thêm một chút, câu trả lời sẽ trở thành "có, nó có thể được thực hiện, nhưng bạn không nhất thiết phải làm như vậy".

Thứ nhất, chỉ để chứng minh rằng nó có thể được thực hiện:

SELECT u.* FROM users u 
INNER JOIN skills s1 ON (u.id = s1.user_id AND s1.skill_name = 'php') 
INNER JOIN skills s2 ON (u.id = s2.user_id AND s2.skill_name = 'html') 
WHERE s1.skill_level = 2 AND s2.skill_level = 1 GROUP BY u.id; 

Sẽ có lưu tôi khá nhiều gõ nếu bạn muốn giải thích những gì bạn muốn ngay từ đầu! :)

Bây giờ bạn có nên làm như trên không? Nó không phải là rất đẹp, nhưng nguyên tắc là bạn tham gia vào bảng hai lần cho cả hai kỹ năng khác nhau, sử dụng bí danh (s1 và s2) để che giấu thực tế rằng đó là cùng một bảng. Đôi khi đây là cách tiếp cận đúng. Những rắc rối là tôi nghi ngờ bạn sẽ có vô số các biến thể về điều này, nơi bạn muốn đôi khi tìm thấy những người có nhiều kỹ năng ở các cấp độ khác nhau, đôi khi chỉ có một, etcetera. Bạn có thể thấy việc viết mã để tự động tạo ra các truy vấn đó hơi phức tạp và nó không nhất thiết phải mở rộng quy mô.

Bạn cần để đọc thông tin cơ sở dữ liệu chuẩn hóa để thiết kế bảng của bạn tốt hơn. Và bạn cũng nên có một trường id cho bảng kỹ năng và sau đó bạn có thể dễ dàng sử dụng các truy vấn phụ khi bạn cần.

+0

bạn đã đọc câu trả lời của tôi trước khi trả lời chưa? – dynamic

+0

Không. Bạn trả lời trong khi tôi đang viết. OP rõ ràng là bắt đầu với SQL vì vậy tôi muốn cung cấp thêm một chút câu trả lời đầy đủ. Tại sao? – taliesinnuin

+0

tôi đặt thêm một số thông tin. cảm ơn bạn đã thử – Mbodock

0

Để lấy một danh sách người dùng có một kỹ năng HTML trong tổng số 1 và một kỹ năng PHP 2:

SELECT u.name 
FROM users u JOIN skills s1 ON u.id = s1.user_id AND s1.skill = 'php' 
JOIN skills s2 ON u.ud = s2.user_id AND s2.skill = 'html' 
WHERE s1.skill_level = 2 
AND s2.skill_level = 1 

Nếu bạn muốn tất cả những người sử dụng với cả HTML và PHP bạn có thể thả các mệnh đề WHERE hoàn toàn . Nếu bạn muốn tất cả người dùng có kỹ năng PHP tối thiểu là 2, bạn chỉ cần thay đổi điều khoản thành

s1.skill_level >= 2 
Các vấn đề liên quan