2010-10-15 13 views
7

Perché sto ottenendo un # 1222 - Le istruzioni SELECT utilizzate hanno un diverso numero di colonne ? sto provando a caricare i messaggi sul muro dagli amici di questo utente e da se stesso.# 1222 - Le istruzioni SELECT utilizzate hanno un diverso numero di colonne

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 struttura della tabella wall_posts assomiglia iddateprivacypiduidmessage

La struttura della tabella Amici assomiglia Fididbuddy_idinvite_up_datestatus

pid è sinonimo di profilo id. Non sono sicuro di cosa stia succedendo.

risposta

16

La prima affermazione nel UNION restituisce quattro colonne:

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

La seconda ritorna sei, perché il * si espande per includere tutte le colonne da WALL_POSTS:

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

Gli operatori UNION e UNION ALL richiedono:

  1. Lo stesso numero di colonne esiste in tutte le istruzioni che compongono la query UNION'd
  2. I tipi di dati devono corrispondere ad ogni posizione/colonna

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

Grazie! Questo ha aiutato a risolvere il mio problema. Utile da sapere anche per la strada più avanti. – Keverw

+0

Tu sei il pony, i pony OMG .... – usumoio

3

Stai prendendo il UNION di una relazione a 4 colonne (id, pid, message, e date) con una relazione 6 colonne (* = le 6 colonne di wall_posts). SQL non ti consente di farlo.

+0

Qualsiasi lavoro in giro? – Keverw

+0

Cambia l'ultimo 'SELECT' per selezionare le 4 colonne di cui hai bisogno. Non dovresti usare comunque "SELECT *": è vulnerabile a rompere ogni volta che qualcuno fa un "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 
    ) 

Si stava selezionando 4 nella prima query e 6 nella seconda, quindi confrontarli.

Problemi correlati