Подтвердить что ты не робот

Используемые операторы SELECT имеют различное количество столбцов (REDUX!!)

Там был еще один вопрос, похожий на это, но, похоже, он не ответил на мой вопрос.

Мой вопрос таков: почему я возвращаю эту ошибку ERROR 1222 (21000): The used SELECT statements have a different number of columns из следующего 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;

Здесь 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    |                |
+------------+---------------+------+-----+---------+----------------+

Здесь 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    |                |
+---------------+--------------------------------------+------+-----+---------+----------------+

Если вы хотите дать какие-либо отзывы о чем-нибудь сумасшедшем, вы также увидите здесь, пожалуйста, не стесняйтесь. Я возьму свои куски.

4b9b3361

Ответ 1

UNIONs (UNION и UNION ALL) требуют, чтобы все запросы UNION'd имели:

  • То же количество столбцов в предложении SELECT
  • Тип данных столбца должен совпадать в каждой позиции

В вашем запросе есть:

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

Простейшая перезапись у меня:

   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;

В LEFT JOIN'е вы попали в таблицу USERS дважды, но, похоже, не используете эту информацию.