# 1222 - Используемые операторы SELECT имеют разное количество столбцов - PullRequest
10 голосов
/ 16 октября 2010

Почему я получаю # 1222 - Используемые операторы SELECT имеют разное количество столбцов?я пытаюсь загрузить сообщения на стене от друзей и его пользователей.

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

Структура таблицы wall_posts выглядит следующим образом: id date privacy pid uid message

Структура таблицы Friends выглядит следующим образом: Fid id buddy_id invite_up_date status

pid обозначает идентификатор профиля.Я не совсем уверен, что происходит.

Ответы [ 3 ]

19 голосов
/ 16 октября 2010

Первый оператор в UNION возвращает четыре столбца:

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

Второй возвращает шесть , потому что * расширяется, чтобы включить все столбцы из WALL_POSTS:

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

Операторы UNION и UNION ALL требуют, чтобы:

  1. Одинаковое количество столбцов существует во всех операторах, составляющих запрос UNION
  2. Типы данных должны совпадать в каждой позиции / столбце

Использование:

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))
3 голосов
/ 16 октября 2010

Вы берете UNION отношения 4 столбцов (id, pid, message и date) с отношением 6 столбцов (* = 6 столбцов wall_posts). SQL не позволяет вам этого делать.

2 голосов
/ 16 октября 2010
(
        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
    )

Вы выбрали 4 в первом запросе и 6 во втором, поэтому сопоставьте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...