MySQL запрос с UNION ALL выдает ошибку 1271 - PullRequest
2 голосов
/ 04 января 2011

У меня есть разные таблицы для хранения комментариев различных частей сайта, имеющих одинаковую структуру.Я хочу модерировать комментарии на панели администратора, но я не могу сделать страницу для каждого, поэтому я хочу выделить все и затем ОГРАНИЧИТЬ.Я спросил, как это сделать здесь, на SO, и они решили мой вопрос, но я получил ошибку: 1271 - Недопустимое сочетание параметров сортировки для операции 'UNION' .

SELECT  *
FROM    (
        SELECT  *
        FROM    (
                SELECT  *
                FROM  noticias_comentarios
                ORDER BY
                        ts_creado DESC
                LIMIT 10
                ) q
        UNION ALL
        SELECT  *
        FROM    (
                SELECT  *
                FROM carruseles_comentarios
                ORDER BY
                        ts_creado DESC
                LIMIT 10
                ) q
        ) q
JOIN    usuarios u
ON      u.id = q.id_usuario
ORDER BY
        ts_creado DESC
LIMIT   0, 10

Все 3Таблицы имеют набор символов utf8 и параметры сортировки utf8_spanish_ci.

Как я могу это решить?

Заранее спасибо.

ОБНОВЛЕНО ответом Ларри:

SELECT  *
FROM    (
   SELECT id, id_noticia, id_usuario, comentario, ts_creado
   FROM  noticias_comentarios
   ORDER BY ts_creado DESC
   LIMIT 0, 10
  UNION ALL
   SELECT id, id_carrusel, id_usuario, comentario, ts_creado
   FROM carruseles_comentarios
   ORDER BY  ts_creado DESC
   LIMIT 0, 10
  ) q
JOIN    usuarios u  ON u.id = q.id_usuario
ORDER BY ts_creado DESC
LIMIT   0, 10

Теперь выдает ошибку: 1221 - Неправильное использование UNION и ORDER BY

Ответы [ 3 ]

2 голосов
/ 04 января 2011

Уч. Вещи, которые поражают меня с первого взгляда:

  • Не думаю, что вам нужны все эти вложенные наборы результатов.

  • Вы повторно используете псевдоним "q" для нескольких различных запросов.

  • Вы не должны использовать SELECT * в UNIONs. Вы должны указать, какие столбцы вы хотите и в каком порядке (и они должны совпадать в разных результирующих наборах, которые вы объединяете вместе).

Попробуйте следующее:

SELECT  *
FROM    (
   (SELECT col1, col2. . .
   FROM  noticias_comentarios
   ORDER BY ts_creado DESC
   LIMIT 10)
  UNION ALL
   (SELECT col1, col2. . .
   FROM carruseles_comentarios
   ORDER BY  ts_creado DESC
   LIMIT 10)
  ) q
JOIN    usuarios u  ON u.id = q.id_usuario
ORDER BY ts_creado DESC
LIMIT   0, 10

(Предполагается, что вам нужны многоуровневые ограничения - десять лучших из двадцати записей, состоящих из первой десятки нотиций и первой десятки каруселей).

1 голос
/ 04 января 2011

Эта ошибка вызвана первым ORDER BY в запросах, которые вы объединяете вместе:

ОШИБКА 1221 (HY000): неправильное использование UNION и ORDER BY

Вы должны просто удалить этот ORDER BY и LIMIT и применить его к результатам UNION ALL.Как это:

SELECT  *
FROM    (
   SELECT id, id_noticia, NULL as id_carrusel, id_usuario, comentario COLLATE utf8_spanish_ci, ts_creado
   FROM  noticias_comentarios
  UNION ALL
   SELECT id, NULL as id_noticia, id_carrusel, id_usuario, comentario, ts_creado
   FROM carruseles_comentarios
   ORDER BY  ts_creado DESC
   LIMIT 0, 10
  ) q
JOIN    usuarios u  ON u.id = q.id_usuario
ORDER BY q.ts_creado DESC
LIMIT   0, 10
0 голосов
/ 04 января 2011

убедитесь, что таблицы carruseles_comentarios и noticias_comentarios имеют одинаковое количество столбцов: Если у них разное количество столбцов, попробуйте получить только общие столбцы, например:

SELECT  *
    FROM    (
            SELECT  col1, col2
            FROM  noticias_comentarios
            ORDER BY
                    ts_creado DESC
            LIMIT 10
            ) q
    UNION ALL
    SELECT  *
    FROM    (
            SELECT  col1, col2
            FROM carruseles_comentarios
            ORDER BY
                    ts_creado DESC
            LIMIT 10
            ) q
    ) q
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...