2010-09-07 11 views
10

Hay otra pregunta similar a esta, pero no pareció responder mi pregunta.Las instrucciones SELECT utilizadas tienen un número diferente de columnas (¡REDUX!)

Mi pregunta es la siguiente: ¿por qué estoy volver a este error ERROR 1222 (21000): The used SELECT statements have a different number of columns desde el siguiente SQL

SELECT * FROM friends 
LEFT JOIN users AS u1 ON users.uid = friends.fid1 
LEFT JOIN users AS u2 ON users.uid = friends.fid2 
WHERE (friends.fid1 = 1) AND (friends.fid2 > 1) 
UNION SELECT fid2 FROM friends 
WHERE (friends.fid2 = 1) AND (friends.fid1 < 1) 
ORDER BY RAND() 
LIMIT 6; 

Aquí es users:

+------------+---------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+---------------+------+-----+---------+----------------+ 
| uid  | int(11)  | NO | PRI | NULL | auto_increment | 
| first_name | varchar(50) | NO |  | NULL |    | 
| last_name | varchar(50) | NO |  | NULL |    | 
| email  | varchar(128) | NO | UNI | NULL |    | 
| mid  | varchar(40) | NO |  | NULL |    | 
| active  | enum('N','Y') | NO |  | NULL |    | 
| password | varchar(64) | NO |  | NULL |    | 
| sex  | enum('M','F') | YES |  | NULL |    | 
| created | datetime  | YES |  | NULL |    | 
| last_login | datetime  | YES |  | NULL |    | 
| pro  | enum('N','Y') | NO |  | NULL |    | 
+------------+---------------+------+-----+---------+----------------+ 

Aquí es friends:

+---------------+--------------------------------------+------+-----+---------+----------------+ 
| Field   | Type         | Null | Key | Default | Extra   | 
+---------------+--------------------------------------+------+-----+---------+----------------+ 
| friendship_id | int(11)        | NO | MUL | NULL | auto_increment | 
| fid1   | int(11)        | NO | PRI | NULL |    | 
| fid2   | int(11)        | NO | PRI | NULL |    | 
| status  | enum('pending','accepted','ignored') | NO |  | NULL |    | 
+---------------+--------------------------------------+------+-----+---------+----------------+ 

Si quiero dar tu opinión sobre cualquier cosa loca que veas pasando aquí, también, siéntase libre de hacerlo. Tomaré mis bultos.

+3

+1: Gracias por publicar una nueva pregunta para un nuevo mensaje de error. –

+0

¡Gracias por sugerirlo! Realmente lo aprecio, particularmente cuando soy nuevo en las costumbres generales de Stack. –

Respuesta

30

sindicatos (UNION y UNION ALL) requieren que todas las consultas ser UNION'd tiene:

  1. El mismo número de columnas en la cláusula SELECT
  2. La columna de tipo de datos tiene que coincidir en cada posición

Su consulta tiene:

SELECT f.*, u1.*, u2.* ... 
UNION 
SELECT fid2 FROM friends 

La forma más fácil re-escritura que tengo es:

SELECT f.*, u.* 
    FROM FRIENDS AS f 
    JOIN USERS AS u ON u.uid = f.fid2 
    WHERE f.fid1 = 1 
     AND f.fid2 > 1 
UNION 
    SELECT f.*, u.* 
    FROM FRIENDS AS f 
    JOIN USERS AS u ON u.uid = f.fid1 
    WHERE f.fid2 = 1 
     AND f.fid1 < 1 
ORDER BY RAND() 
LIMIT 6; 

usted ha dejado JOIN'd a la mesa USERS dos veces, pero no parece ser el uso de la información.

+0

¡Gran respuesta! ¿Tiene alguna idea de cómo se supone que debo unirme a la tabla de 'usuarios' para usar realmente la información? ¿Me estoy perdiendo un 'SELECT' en alguna parte? –

+0

También estoy REALMENTE molesto porque no puedo seleccionar una respuesta hasta que haya transcurrido un cierto tiempo. Me hace desear a Quora. –

+0

@Josh Smith: La pregunta es, ¿qué es lo que quieres/necesito hacer? Si desea la información del usuario, deberá agregar las mismas uniones a ambos lados de la declaración de UNIÓN y asegurarse de que las columnas caigan en el orden correcto según la primera consulta en la UNIÓN. Además, si la columna 'fid1' (o' fid2') no puede ser NULL, no hay necesidad de un LEFT JOIN - use un [INNER] JOIN. –

Cuestiones relacionadas