Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Сортировка объединенного запроса MySQL

letsplayer
сообщение 11.6.2014, 12:03
Сообщение #1
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Привет. Возникает ошибка при выполнении запроса в MySQL.

Структура таблицы:
Цитата
[msg_id] [author] [address] [text] [date]


Есть два запроса объединенных в один, оба фильтруют одинаковые значения порядковых номеров, первый из author, второй из address.
Суть проблемы в том, что одиночный запрос без проблем способен сортировать полученные строки по дате, но объединенный выдает ошибку - #1054 - Unknown column 'date' in 'order clause'
Пробовал вместо имени столбца (date) указывать его порядковый номер, но все безрезультатно.
Сам запрос:
Код
SELECT DISTINCT `author` FROM `messages` WHERE `address` = '10'
UNION
SELECT DISTINCT `address` FROM `messages` WHERE `author` = '10'
ORDER BY `date` DESC


Как можно исправить проблему в рамках MySQL?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Safety1st
сообщение 11.6.2014, 13:41
Сообщение #2
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Чтобы по дате сортировать результирующую таблицу, дату из базы нужно тоже брать. И:
Цитата
Если для всего результата UNION необходимо применить оператор ORDER BY, следует использовать круглые скобки.

Как-то так:
Код
(SELECT DISTINCT `author`, `date` FROM `messages` WHERE `address` = '10')
UNION
(SELECT DISTINCT `address`, `date` FROM `messages` WHERE `author` = '10')
ORDER BY `date` DESC
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя onotole
сообщение 11.6.2014, 14:14
Сообщение #3


Иконка группы

Стаж: 13 лет

Сообщений: 1572
Благодарностей: 1119
Полезность: 1550

Меценат Меценат

/del
не увидел юнион

Отредактировал: onotole, - 11.6.2014, 14:15
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 14:34
Сообщение #4
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Цитата(Safety1st @ 11.6.2014, 15:41) *
Чтобы по дате сортировать результирующую таблицу, дату из базы нужно тоже брать. И:

Как-то так:
Код
(SELECT DISTINCT `author`, `date` FROM `messages` WHERE `address` = '10')
UNION
(SELECT DISTINCT `address`, `date` FROM `messages` WHERE `author` = '10')
ORDER BY `date` DESC

Спасибо, но нет. Та же самая ошибка.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя onotole
сообщение 11.6.2014, 14:37
Сообщение #5


Иконка группы

Стаж: 13 лет

Сообщений: 1572
Благодарностей: 1119
Полезность: 1550

Меценат Меценат

http://phpclub.ru/mysql/doc/union.html
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 14:37
Сообщение #6
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Хотя нет, запрос прошел, но никакой фильтрации в поле author нет.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 15:10
Сообщение #7
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Цитата(onotole @ 11.6.2014, 16:37) *

Код
(SELECT DISTINCT `address` FROM `messages` WHERE `author` = 10 ORDER BY `date` DESC)
UNION
(SELECT DISTINCT `author` FROM `messages` WHERE `address` = 10 ORDER BY `date` DESC)
ORDER BY date DESC

Как не работало - так и не работает. Какими только способами не пытался.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 15:38
Сообщение #8
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Если у кого-то будет время, попробуйте что-то сделать.
Приложил тестовый дамп таблицы.

Отредактировал: letsplayer, - 11.6.2014, 15:39
Прикрепленные файлы:
Прикрепленный файл  messages.txt ( 2,72 килобайт ) Кол-во скачиваний: 4
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.6.2014, 16:55
Сообщение #9
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

letsplayer, а что вы хотите в итоге получить? Поясните на примере.
Сейчас внимательнее сами запросы глянул - логики не вижу.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 17:15
Сообщение #10
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Цитата(Safety1st @ 11.6.2014, 18:55) *
letsplayer, а что вы хотите в итоге получить? Поясните на примере.
Сейчас внимательнее сами запросы глянул - логики не вижу.

Диалоги между пользователями. В таблице, одна строка - одно сообщение, я получаю все строки, когда Я - автор и когда Я - получатель, соответственно у меня будут все строки, в которых я принимал участие. Но так как я делаю список диалогов - фильтрую одинаковые значения, то есть оставляю только одно сообщение с одним пользователем, формируя список диалогов, далее пытаюсь сортировать сообщения по дате (убывание), чтобы в ЛС отображался последний диалог. Я нашел разные выходы из ситуации, но все они требуют создания дополнительной таблицы для хранения ID каждого диалога, но у меня и так все готово, осталось только отсортировать, но вот не выходит.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.6.2014, 17:28
Сообщение #11
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(letsplayer @ 11.6.2014, 16:37) *
Хотя нет, запрос прошел, но никакой фильтрации в поле author нет.

Это на предложенный мной вариант? А что есть? О какой фильтрации речь? В запросе фильтров, кроме '<> = 10' нет.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 17:36
Сообщение #12
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Цитата(Safety1st @ 11.6.2014, 19:28) *
Это на предложенный мной вариант? А что есть? О какой фильтрации речь? В запросе фильтров, кроме '<> = 10' нет.

Насколько я помню там одинаковые значения не удалялись.
Фильтрация есть и это DISTINCT, к тому же, его можно вообще не указывать, так как при UNION фильтрация включена по умолчанию.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Anton1o
сообщение 11.6.2014, 17:45
Сообщение #13


Стаж: 17 лет

Сообщений: 919
Благодарностей: 1392
Полезность: 1160

letsplayer,
Можно взглянуть на код программы?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 11.6.2014, 18:17
Сообщение #14
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Цитата(Anton1o @ 11.6.2014, 19:45) *
letsplayer,
Можно взглянуть на код программы?

Конечно, можно, но для чего нужен скрипт? Его работа никак не влияет на данную проблему, все, что нужно - это сформулировать правильный запрос.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.6.2014, 19:34
Сообщение #15
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(letsplayer @ 11.6.2014, 19:36) *
Насколько я помню там одинаковые значения не удалялись.
Фильтрация есть и это DISTINCT, к тому же, его можно вообще не указывать, так как при UNION фильтрация включена по умолчанию.

А, вы про дублирующиеся записи... Это ж не сортировка.
Не должно быть проблемы.

Мне кажется, при поиске истории переписки между 2-мя участниками разумнее такой запрос:
Код
SELECT `author_id` , `address_id` , `send_date`
FROM `messages`
WHERE (
    `author_id` =14
AND `address_id` =10
)
OR (
    `author_id` =10
AND `address_id` =14
)
ORDER BY `message_id` DESC
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 12.6.2014, 10:42
Сообщение #16
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

Цитата(Safety1st @ 11.6.2014, 21:34) *
А, вы про дублирующиеся записи... Это ж не сортировка.
Не должно быть проблемы.

Мне кажется, при поиске истории переписки между 2-мя участниками разумнее такой запрос:
Код
SELECT `author_id` , `address_id` , `send_date`
FROM `messages`
WHERE (
    `author_id` =14
AND `address_id` =10
)
OR (
    `author_id` =10
AND `address_id` =14
)
ORDER BY `message_id` DESC


Этот запрос отображает ВСЮ переписку между ОДНИМ диалогом, а нужно в итоге получить все диалоги (это я уже успешно сделал, кроме сортировки дат).
Спасибо за помощь, но думаю, не стоит больше тратить Вам на это свои нервы, я что-нибудь придумаю.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
letsplayer
сообщение 12.6.2014, 13:29
Сообщение #17
Стаж: 13 лет

Сообщений: 215
Благодарностей: 35
Полезность: 0

А ничего придумать и не получилось.
Последняя попытка, возможно, кто-то не понял.
Вот запрос:
Код
SELECT *  FROM `messages` WHERE `author_id` = 10 OR `address_id` = 10

Получаем:

Нужно фильтровать одно из двух этих сообщений, сортируя по дате (DESC), исходя из запроса выше.

Отредактировал: letsplayer, - 12.6.2014, 13:29
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: