2010-05-05 34 views
14

Tôi muốn để có được một số kết quả qua truy vấn simillar để:MySQL JOIN với NẾU điều kiện

SELECT 
    * FROM 
    users LEFT JOIN 
    IF (users.type = '1', 'private','company') AS details ON 
    users.id = details.user_id WHERE 
    users.id = 1 

ý tưởng Bất kỳ?

Trả lời

21
SELECT * FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1 

UNION 

SELECT * FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1 

Tôi nghĩ rằng đó là những gì bạn đang cố gắng để làm, phải không?

Như bạn đã nói rằng số cột khác nhau, bạn sẽ cần chỉ định các cột, ví dụ:

SELECT 'private' AS detailType, users.*, col1, col2, col3, '' FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1 

UNION 

SELECT 'company', users.*, col1, '', '', col4 FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1 

Trong ví dụ này, riêng tư có cột col1, col2 và col3, trong khi công ty có col1 và col4, nhưng bạn muốn tất cả.

+0

Tôi không biết tại sao bây giờ tôi nhận được # 1222 - Các câu lệnh SELECT được sử dụng có số cột khác nhau – plugowski

+0

nếu tôi chỉ sử dụng một phần của mã tức là. SELECT * FROM người dùng LEFT JOIN tin AS chi tiết ON users.id = details.user_id ĐÂU users.id = 1 AND users.type = 1 nhưng nếu tôi sử dụng UNION Tôi đã nhận được lỗi # 1222 – plugowski

+0

Nếu bạn có một số cột khác nhau trong hai bảng (riêng và công ty) thì bạn sẽ cần phải xác định cùng một số cột trong SELECT. Bạn có thể điền vào các khoảng trống bằng cách sử dụng NULL, '', hoặc bất cứ điều gì bạn muốn. – Cez

6
SELECT 
    users.*, 
    details.info, 
    CASE users.type WHEN '1' THEN 'private' ELSE 'company' END AS user_type 
FROM 
    users 
    INNER JOIN (
    SELECT user_id, info FROM private 
    UNION 
    SELECT user_id, info FROM company 
) AS details ON details.user_id = users.id 

EDIT: Phiên bản gốc của câu trả lời (câu hỏi hiểu lầm):

SELECT 
    *, 
    CASE type WHEN '1' THEN 'private' ELSE 'company' END AS details 
FROM 
    users 
WHERE 
    users.id = 1 
+0

Đó không phải là chính xác những gì tôi muốn. riêng tư và công ty là hai bảng khác nhau, mà tôi muốn Tham gia: khi user.type == 1 Tôi muốn JOIN riêng tư ON user.id = private.user_id và khi user.type == 2 Tôi muốn JOIN company ON user.id = company.user_id – plugowski

+0

@plugowski: Xem câu trả lời đã thay đổi. – Tomalak

15

Tôi chắc chắn điều này đã được giải quyết, nhưng đối với những người có vấn đề tương tự.

Bạn cũng có thể thử nhiều trái tham gia để có được tất cả các dữ liệu

SELECT *, IF (users.type = 1, p.name, c.name) AS name FROM users 
LEFT JOIN private AS p ON (users.type = 1 AND users.id = p.user_id) 
LEFT JOIN company AS c ON (users.type != 1 AND users.id = c.user_id)