2010-10-15 11 views
7

¿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.# 1222 - Las instrucciones SELECT utilizadas tienen un número diferente de columnas

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 parece iddateprivacypiduidmessage

La estructura de la tabla Amigos parece Fididbuddy_idinvite_up_datestatus

PID representa el perfil id. No estoy realmente seguro de lo que está pasando.

Respuesta

16

La primera declaración de 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 uno vuelve seis, debido a que el * se expande para incluir 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 todos los estados que conforman la consulta UNION'd
  2. Los tipos de datos tienen que coincidir en cada posición/columna

Uso:

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)) 
+0

¡Gracias! Eso ayudó a solucionar mi problema. Útil para saber más adelante en el camino también. – Keverw

+0

Eres el pony, OMG Ponies ... – usumoio

3

Usted está tomando el 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.

+0

¿Algún problema? – Keverw

+0

Cambie el último 'SELECCIONAR' para seleccionar las 4 columnas que necesita. No debería usar 'SELECT *' de todos modos: es vulnerable a las interrupciones cada vez que alguien hace una 'ALTER TABLE'. – dan04

2
(
     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 
    ) 

Usted estaba seleccionando 4 en la primera consulta y 6 en la segunda, así que combínelos.

Cuestiones relacionadas