Le istruzioni SELECT utilizzate hanno un numero diverso di colonne (REDUX !!)

C’è un’altra domanda là fuori simile a questa, ma non sembra rispondere alla mia domanda.

La 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 gli 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 gli 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 vuoi dare un feedback su qualcosa di pazzo che vedi succedere anche qui, per favore sentiti libero di farlo. Prenderò i miei grumi.

Le UNION ( UNION e UNION ALL ) richiedono che tutte le query che UNION abbia:

  1. Lo stesso numero di colonne nella clausola SELECT
  2. Il tipo di dati della colonna deve corrispondere in ogni posizione

La tua richiesta ha:

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

La riscrittura più semplice 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 LEFT JOIN alla tabella USERS due volte, ma non sembra che stiano usando le informazioni.