# 1222 – Las instrucciones SELECT utilizadas tienen un número diferente de columnas

¿Por qué recibo un # 1222 – Las instrucciones SELECT utilizadas tienen un número diferente de columnas? Estoy tratando de cargar publicaciones en el muro de amigos de este usuario y de él mismo.

SELECT u.id AS pid, b2.id AS id, b2.message AS message, b2.date AS date FROM ( ( SELECT b.id AS id, b.pid AS pid, b.message AS message, b.date AS date FROM wall_posts AS b JOIN Friends AS f ON f.id = b.pid WHERE f.buddy_id = '1' AND f.status = 'b' ORDER BY date DESC LIMIT 0, 10 ) UNION ( SELECT * FROM wall_posts WHERE pid = '1' ORDER BY date DESC LIMIT 0, 10 ) ORDER BY date DESC LIMIT 0, 10 ) AS b2 JOIN Users AS u ON b2.pid = u.id WHERE u.banned='0' AND u.email_activated='1' ORDER BY date DESC LIMIT 0, 10 

La estructura de la tabla wall_posts tiene el mismo aspecto que id

La estructura de la tabla Friends se parece a Fid id buddy_id invite_up_date status

pid significa ID de perfil. No estoy realmente seguro de lo que está pasando.

La primera statement en la UNIÓN devuelve cuatro columnas:

 SELECT b.id AS id, b.pid AS pid, b.message AS message, b.date AS date FROM wall_posts AS b 

El segundo devuelve seis , porque * se expande para include todas las columnas de WALL_POSTS :

 SELECT b.id, b.date, b.privacy, b.pid. b.uid message FROM wall_posts AS b 

Los operadores UNION y UNION ALL requieren que:

  1. El mismo número de columnas existe en todas las declaraciones que conforman la consulta UNION
  2. Los types de datos tienen que coincidir en cada position / columna

Utilizar:

 FROM ((SELECT b.id AS id, b.pid AS pid, b.message AS message, b.date AS date FROM wall_posts AS b JOIN Friends AS f ON f.id = b.pid WHERE f.buddy_id = '1' AND f.status = 'b' ORDER BY date DESC LIMIT 0, 10) UNION (SELECT id, pid, message, date FROM wall_posts WHERE pid = '1' ORDER BY date DESC LIMIT 0, 10)) 

Está tomando la UNION de una relación de 4 columnas ( id , pid , message y date ) con una relación de 6 columnas ( * = las 6 columnas de wall_posts ). SQL no te deja hacer eso.

 ( SELECT b.id AS id, b.pid AS pid, b.message AS message, b.date AS date FROM wall_posts AS b JOIN Friends AS f ON f.id = b.pid WHERE f.buddy_id = '1' AND f.status = 'b' ORDER BY date DESC LIMIT 0, 10 ) UNION ( SELECT id, pid , message , date FROM wall_posts WHERE pid = '1' ORDER BY date DESC LIMIT 0, 10 ) 

Estabas seleccionando 4 en la primera consulta y 6 en la segunda, así que compáralos.