2010-05-05 15 views
14

que quieren obtener algunos resultados a través de la consulta a simillar:MySQL JOIN con condiciones IF

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

¿Alguna idea?

Respuesta

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 

Creo que eso es lo que está tratando de hacer, ¿verdad?

Como ha dicho ahora que el número de columnas es diferente, debe especificar las columnas, p.

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 

En este ejemplo, privado tiene columnas col1, col2 y col3, mientras que la compañía tiene col1 y col4, pero todos ellos quieren.

+0

No sé por qué ahora tengo # 1222 - Las instrucciones SELECT utilizadas tienen un número diferente de columnas – plugowski

+0

si utilizo solo una parte del código, es decir. SELECT * FROM usuarios LEFT JOIN privada como detalles sobre users.id = details.user_id DONDE users.id = 1 y = 1 users.type pero si uso UNIÓN He obtener error # 1222 – plugowski

+0

Si tener un número diferente de columnas en las dos tablas (privadas y de empresa), entonces deberá especificar el mismo número de columnas en SELECT. Puede completar los espacios en blanco usando NULL, '', o lo que quiera. – 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: Versión original de la respuesta (pregunta mal entendida):

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

No es exactamente lo que quiero. private y company son dos tablas diferentes, en las que quiero unirme: cuando user.type == 1 Quiero JOIN private ON user.id = private.user_id y cuando user.type == 2 Quiero JOIN company ON user.id = company.user_id – plugowski

+0

@plugowski: ver respuesta modificada. – Tomalak

15

Estoy seguro de que esto ya está resuelto, pero para las personas con un problema similar.

También puede tratar de múltiples izquierda se une para obtener todos los datos

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)