2010-09-07 8 views
10

C'è un'altra domanda simile a questa, ma non sembra rispondere alla domanda .Le istruzioni SELECT utilizzate hanno un diverso numero di colonne (REDUX !!)

mia domanda è questa: perché sto tornando questo errore ERROR 1222 (21000): The used SELECT statements have a different number of columns dal seguente 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; 

Ecco 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 |    | 
+------------+---------------+------+-----+---------+----------------+ 

Ecco 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 |    | 
+---------------+--------------------------------------+------+-----+---------+----------------+ 

Se voglio dare qualsiasi feedback su qualsiasi cosa pazza che vedi andando anche qui, per favore sentiti libero di farlo. Prenderò i miei grumi.

+3

+1: Grazie per aver postato una nuova domanda per un nuovo messaggio di errore. –

+0

Grazie per averlo suggerito! Lo apprezzo davvero, soprattutto quando sono nuovo ai costumi generali di Stack. –

risposta

30

raccordi (UNION e UNION ALL) richiedono che tutte le query essendo UNION'd ha:

  1. Lo stesso numero di colonne nella clausola SELECT
  2. tipo di dati
  3. La colonna deve corrispondere ad ogni posizione

Vostri criteri ha:

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

Il metodo più semplice ri-scrittura che ho è:

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; 

hai lasciato JOIN'd al tavolo USERS due volte, ma non sembrano essere utilizzando le informazioni.

+0

Ottima risposta! Hai idea di come dovrei unirmi al tavolo degli utenti per utilizzare effettivamente le informazioni? Mi manca un 'SELECT' da qualche parte? –

+0

Sono anche VERAMENTE disturbato dal fatto che non riesco a selezionare una risposta finché non è trascorso un certo periodo di tempo. Mi fa desiderare troppo per Quora. –

+0

@Josh Smith: la domanda è: cosa vuoi/devi fare? Se si desiderano le informazioni dell'utente, sarà necessario aggiungere gli stessi join a entrambi i lati dell'istruzione UNION e assicurarsi che le colonne rientrino nell'ordine corretto in base alla prima query nell'UNION. Inoltre, se la colonna 'fid1' (o' fid2') non può essere NULL, non c'è bisogno di un SINISTRA SINISTRA - usa un JOINT [INTERIORE]. –

Problemi correlati