Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отсортировать по полю и найти соседние строки 
:(
    Опции темы
promex
Дата 26.7.2012, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.7.2012

Репутация: нет
Всего: нет



задача найти соседние строки (+/- 3) для определнного ID, но таблицу перед этим необходимо отсортировать, а не получить из базы в состоянии поставки, по другому параметру (не ID), например, "param_1"

т.е. задача как вот здесь http://forum.vingrad.ru/index.php?showtopic=69960&hl= и как найти 3 сосдених строки вверх и вних понятно, но как перед этим, в этом же запросе или в другом, отсортировать таблицу по параметру "param_1", чтобы выбирать соседние значения для "param_1"  из уже отсортированной по этому параметру таблицы

в SQL не силен, поэтому возможно вопрос и глупый)

Это сообщение отредактировал(а) promex - 26.7.2012, 08:13
PM MAIL   Вверх
Zloxa
Дата 26.7.2012, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(promex @  26.7.2012,  09:10 Найти цитируемый пост)
задача найти соседние строки (+/- 3) для определнного ID, но таблицу перед этим необходимо отсортировать, а не получить из базы в состоянии поставки, по другому параметру (не ID), например, "param_1"

Код

select * from table where param_1 > (select param_1 from table where id = :id) order by param_1 limit 3
union all
select * from table where param_1 < (select param_1 from table where id = :id) order by param_1 desc limit 3


Это сообщение отредактировал(а) Zloxa - 26.7.2012, 08:24


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
promex
Дата 26.7.2012, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.7.2012

Репутация: нет
Всего: нет



может кому в будущем пригодиться, в php mysql_query надо ставить собочки для каждого SELECT'а между UNION

Код

$query = "(SELECT * FROM 45gy_content WHERE param_1 >= (SELECT param_1 FROM bak_a45gy_content WHERE id = $id) ORDER BY param_1 LIMIT 3) 
  union all 
  (SELECT * FROM 45gy_content WHERE param_1 <= (SELECT param_1 FROM bak_a45gy_content WHERE id = $id) ORDER BY param_1 DESC LIMIT 3)";

$cont = mysql_query($query);


спасибо за помощь)

Это сообщение отредактировал(а) promex - 26.7.2012, 09:13
PM MAIL   Вверх
promex
Дата 26.7.2012, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.7.2012

Репутация: нет
Всего: нет



еще вопрос возник, как в этом же запросе SQL перемешать в случайном порядке полученные результаты ?

Это сообщение отредактировал(а) promex - 26.7.2012, 09:13
PM MAIL   Вверх
Zloxa
Дата 26.7.2012, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(promex @  26.7.2012,  09:36 Найти цитируемый пост)
>=


Цитата(promex @  26.7.2012,  09:36 Найти цитируемый пост)
<=


Цитата(promex @  26.7.2012,  09:36 Найти цитируемый пост)
union all 

У вас так может задвоиться запись, относительно которой вы ищите. Оставьте в одном месте строгое неравенство, а там где неравенство не строгое поставьте limit 4 ибо в результате, я так понял,  надо получить семь записей. Одна исходная, три ниже, три выше.

Цитата(promex @  26.7.2012,  10:07 Найти цитируемый пост)
еще вопрос возник, как в этом же запросе SQL перемешать в случайном порядке полученные результаты ?

Код

select s.* from (запрос) s order by rand()


Это сообщение отредактировал(а) Zloxa - 26.7.2012, 09:26


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
promex
Дата 26.7.2012, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.7.2012

Репутация: нет
Всего: нет



Цитата(Zloxa @  26.7.2012,  09:23 Найти цитируемый пост)
У вас так может задвоиться запись

это я отсек условием "AND id <> $id" просто не написал его в цитате. бывает что param_1 точно такой же как у ID, от которого танцуем, и его надо отобразить в первую очередь. 


Цитата(Zloxa @  26.7.2012,  09:23 Найти цитируемый пост)
select * from (запрос) order by rand()

это я знаю, а как его прицепить к искомому запросу с UNION ALL ?
PM MAIL   Вверх
Zloxa
Дата 26.7.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(promex @  26.7.2012,  10:30 Найти цитируемый пост)
это я знаю, а как его прицепить к искомому запросу с UNION ALL ? 

скопипастить искомый запрос в то место, где указано слово "запрос".
Цитата(promex @  26.7.2012,  10:30 Найти цитируемый пост)
бывает что param_1 точно такой же как у ID, от которого танцуем, и его надо отобразить в первую очередь. 

Тогда мы все равно можем получить дублирование записи. Нестрогое неравенство надо оставить лишь в одном подзапросе


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
promex
Дата 26.7.2012, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.7.2012

Репутация: нет
Всего: нет



Цитата(Zloxa @  26.7.2012,  09:38 Найти цитируемый пост)
Тогда мы все равно можем получить дублирование записи

ок

Это сообщение отредактировал(а) promex - 26.7.2012, 10:24
PM MAIL   Вверх
Zloxa
Дата 26.7.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(promex @ 26.7.2012,  10:59)
Цитата(Zloxa @  26.7.2012,  09:38 Найти цитируемый пост)
Тогда мы все равно можем получить дублирование записи

может лучше UNION вместо UNION ALL ??

Определенно, если бы я считал что юнион лучше, я бы его и предложил.

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

Это сообщение отредактировал(а) Zloxa - 26.7.2012, 10:29


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.