2009-05-11 40 views
11

Tôi khá chắc chắn rằng tôi đã nhìn thấy điều này ở đâu đó, nhưng tôi không thể tìm thấy thuật ngữ phù hợp để tôi gặp sự cố ...Cột có điều kiện cho truy vấn dựa trên các cột khác trong MySQL

Giả sử tôi có một bảng với thông tin người dùng (giả sử rằng nó được tạo ra bởi một người được trả tiền nhiều hơn tôi, vì vậy sửa đổi lược đồ không phải là một tùy chọn.) Trong số các cột thông tin người dùng khác nhau là các cột cho DOB ​​và chức danh. Tôi muốn có một truy vấn mà, dựa trên những gì là trong những cột, sẽ bao gồm một cột phụ gọi là "Real_Title", ví dụ:

User_id Job_Title DOB 
    joe_1  manager 01/01/1950 
    jim_1 associate 01/01/1970 
jill_1 associate 01/01/1985 
jane_1  manager 01/01/1975 

truy vấn:

SELECT User_id, Real_Title FROM users 
IF (YEAR(DOB) < 1980 AND Job_Title = "manager") 
    {Real_Title = "Old Fart"} 
ELSE IF (YEAR(DOB) < 1980 AND Job_Title = "associate") 
    {Real_Title = "Old Timer"} 
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "manager") 
    {Real_Title = "Eager Beaver"} 
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "associate") 
    {Real_Title = "Slacker"} 

Tôi biết ở trên không chỉ sai nhưng cũng được mã hóa thực sự không hiệu quả, nhưng tôi muốn có ý tưởng trên.

Có cách nào, không sử dụng kết nối, để điền cột dựa trên thông tin trong một hoặc nhiều cột khác trong cùng một bảng không?

Hiện tại tôi đang sử dụng nội dung nào đó trong tập lệnh PHP sau khi thu được kết quả vào các nhóm tôi muốn, nhưng nếu có thể thực hiện trong truy vấn, điều đó sẽ chuyển truy vấn sang các tập lệnh và ngôn ngữ khác dễ dàng hơn nhiều.

Cảm ơn!

+1

DOB <1980 = Old Fart ?! – JohnB

+2

Kiểm tra tuổi của tôi và thông báo tôi là một bộ hẹn giờ cũ ở mức tốt nhất. – Anthony

Trả lời

21
select User_id 
,case 
    when (YEAR(DOB) < 1980 AND Job_Title = "manager") then 'Old Fart' 
    when (YEAR(DOB) < 1980 AND Job_Title = "associate") then 'Old Timer' 
    when (YEAR(DOB) > 1980 AND Job_Title = "manager") then 'Eager Beaver' 
    when (YEAR(DOB) > 1980 AND Job_Title = "associate") then 'Slacker' 
    else 'nobody' 
end 
as Real_Title 
from users 
14

Nếu tôi hiểu đúng, tôi nghĩ rằng bạn đang tìm kiếm CASE statement:

SELECT User_id, 
     (CASE 
      WHEN YEAR(DOB) < 1980 AND Job_Title = "manager" THEN "Old Fart" 
      WHEN YEAR(DOB) < 1980 AND Job_Title = "associate" THEN "Old Timer" 
      ... 
      ELSE "Unknown Title" 
     END) AS Real_Title 
FROM users; 
Các vấn đề liên quan