powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Следующая и предыдущая страница
24 сообщений из 24, страница 1 из 1
Следующая и предыдущая страница
    #39064411
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте
Есть запрос. Бродит пользователь по каталогу, вошел в раздел, выбрал регион (область) и ему показало список вот за таким запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM post p
LEFT JOIN post_ext e ON ( p.id = e.id ) 
WHERE category=203
AND PLandO = 13
ORDER BY promo DESC , 
FIXED DESC , DATE ASC



отстортировано по promo (репутация - количество репостов) и дате регистрации.

Входит уже в новость по id. Какой самый оптимальный вариант чтоб пользователю показать предыдущую страницу с той же сортировкой ну и следующую. Условие > или < id - не получится. А как ? Может сделать два поля и туда UPDATE загнать готовые id. Но я не знаю как запрос в запрос вставлять.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064422
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159предыдущую страницуПредыдущую страницу чего?
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064430
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftАндрей159предыдущую страницуПредыдущую страницу чего?
Пост, новость, блог, товар в интернет магазине, страница партнера, анкета пользователя - можно называть как угодно.

Нужно в страницу "Новости" (пусть будет новость) уже выдать ссилку на следующую новость и на предыдущую. А нам известно только id новости и все данные новости. А предыдущий запрос показывает не новость а список новостей. Если б мог узнать хотябы позицию в списке, то я бы просто изменил LIMIT н1 , н2 и все. А так не знаю. Понятное дело, что можно давать эту переменную вместе с ссилкой, но тогда поисковые системы начнут наново индексировать, кроме того появится множество зеркальных страниц. Понимаете задачу?
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064452
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно, когда сортировка идет по одному полю, выполняются такого рода запросы:
Код: sql
1.
SELECT id FROM news WHERE news_date<дата_и_время_текущей_новости ORDER BY news_date DESC LIMIT 1

Код: sql
1.
SELECT id FROM news WHERE news_date>дата_и_время_текущей_новости ORDER BY news_date LIMIT 1

Для предыдущей и следующей новости, соответственно.

Как сюда приделать ваши три поля - зависит от их логики.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064466
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот и я о том же. так выходит, что нужно делать дополнительный запрос, который сначала при помощи PHP
пройдеься в цыкле по всем id моего запроса и методом update сделает свой счетчик в дополнительное поле id2. А вот тогда я могу и пользваться уже тем способом что вы описали, только вместо news_date использовать id2, ну и текущий id2. Подцепить под CRON. Другого пути не вижу. Да и то можно готовый id следующего поста прописать в отдельное поле раз уж UPDATE пошел в ход. Не нужно будет потом делать два дополнительных запросов. Ладно. Попробую тогда так сделать. Спасибо
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064482
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159пройдеься в цыкле по всем id моего запроса и методом update сделает свой счетчик в дополнительное поле id2.А что, порядок сортировки всегда один и тот же? Или меняется от чего-то?
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064492
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть, кстати, обходной маневр - передавать номера соседних страниц через дополнительные параметры в url-е.
А чтобы не возникало дублей в индексах поисковиков, добавить каноническую ссылку .
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064596
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftАндрей159пройдеься в цыкле по всем id моего запроса и методом update сделает свой счетчик в дополнительное поле id2.А что, порядок сортировки всегда один и тот же? Или меняется от чего-то?
Порядок один. Сортировка будет менятся в зависимости от рейтинга пользователя. Само события (изменения рейтинга и накрученного (купленного рейтинга)) срабатывает и могу фиксировать в отдельное поле флаг=False. Таким образом можно будет частично делать обновления индексов незатрагивая записей, которые фактически никак не будут изменяться. Пару часиков посижу. Нужно сделать
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064598
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЕсть, кстати, обходной маневр - передавать номера соседних страниц через дополнительные параметры в url-е.
А чтобы не возникало дублей в индексах поисковиков, добавить каноническую ссылку .
Отлично, но из поисковика всегда забрасывает не в каталог, а уже на отдельную страницу, и если так случится, то она не будет иметь никаких переменных. Ссылки не будут работать. Остается вариант только индексировать их самостоятельно.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064603
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Порядок один. Сортировка будет менятсяВы меня озадачили :)
Так один или будет меняться?
Андрей159в зависимости от рейтинга пользователяПользователя, который смотрит эти новости? Т.е. для меня порядок новостей один, для Вас другой?
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064609
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Отлично, но из поисковика всегда забрасывает не в каталог, а уже на отдельную страницу, и если так случится, то она не будет иметь никаких переменных.А какие могут быть соседние страницы, если в этот момент мы не знаем порядка сортировки? Или знаем?
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064614
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаем. есть каталог услуг. Там я доделал область, и остальное осталось - каталоги (каталог услуг). Позицию в каталоге покупают за сколько хотят (свободные торги) или с помощью рейтинга (репосты - "рекомендации"), но рейтинг в сотни меньше имеет веса.
Юзер заходит в каталог, выбирает область, потом вид деятельности и там уже видит всех отсортированных. По цене не буду делать сортировку. Для этого есть отдельно поиск с фильтром. важно чтоб не потеряться в поисковике. В яндекса и гугла правила хоть очень простые, но строгие. Можно маленькую деталь опустить, а она оказывается очень важная. По этому очень осторожно и дипломатично нужно с кодом обходиться - с уважением.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064622
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159ЗнаемНу тогда, наверное, предрассчитанное поле с сортировкой будет оптимальным выходом. По крайней мере, если у вас показ новостей(услуг) происходит намного чаще, чем меняется этот порядок сортировки.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064629
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159,

в наших проектах мы храним предыдущий и последующий индекс в самой записи (товар, страница, новость и т.п.)
эти номера проставляются нормализатором
у нас есть отдельный нормализатор (ну типа обработчик) который запускаем и он проставляет все эти номера
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064636
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixАндрей159,

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

"Нормализатор" это что ? Типа авторская программа на другом языке, которая работает отдаленно на компе и имеет всю копию базы данных ? У меня есть такая на Visual Basic 6 + база данных Access. Тоже думал над этим. И комп на станции круглосуточно работает, можно нагрузить. Вероятно даже что так будет эффективней. Но пометку изменений все же буду оставлять в качестве заявления что нужно переиндексировать. Вы мне подкинули идею
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064665
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Типа авторская программа на другом языке, которая работает отдаленно на компе и имеет всю копию базы данных ? У меня есть такая на Visual Basic 6 + база данных Access. Тоже думал над этим. И комп на станции круглосуточно работает, можно нагрузить. Вероятно даже что так будет эффективней. Но пометку изменений все же буду оставлять в качестве заявления что нужно переиндексировать. Вы мне подкинули идею

что-то вы какие-то страшные вещи рассказываете...
какие-то копии базы данных...
какой-то аксесс...
я прям весь съежился...

мы вроде на форуме мускула находимся....
какой нафиг аксесс?....

не требуется никаких копий
и никаких нагрузок там нет

просто обычный двухпроходный скрипт написанный на коленке за 5 минут
1) за первый проход достаем список айдишников селектом, который содержит условия (всякие там выкинуть скрытые записи, выкинуть какие-то статусы и т.п.), короче получаем некий список номеров типа такого 2134, 2135, 2138, 2146, 2180, 2182 ...
2) затем преобразуем его список тасков такого вида (2134, 0, 2135), (2135, 2134, 2138), (2138, 2135, 2146), (2146, 2138, 2180) ...
3) и фигачим этим списком отдельными апдейтами по каждой записи

Код: sql
1.
2.
3.
update page set pageIdPrev = 0, pageIdPost = 2135 where pageId = 2134;
update page set pageIdPrev = 2135, pageIdPost = 2146 where pageId = 2135;
...



если сделаете фильтр по дате, чтобы нормализатор проапдейтил только новости за последнюю неделю, то он проапдейтит их за минуту...
без всяких нагрузок...
в админке это всего лишь одна кнопка
нажал её и через 2 минуты она завершила работу...
вот и вся "песня"

PS. хотя чую щас набегут тут спецы и будут призывать сначала "изучать предметную область" ))))))))
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064684
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159,

в лоб,
пронумеруйте
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *, @rownum:=@rownum+1
FROM post p JOIN (select @rownum:=0) as rn)
LEFT JOIN post_ext e ON ( p.id = e.id ) 
WHERE category=203
AND PLandO = 13
ORDER BY promo DESC , 
FIXED DESC , DATE ASC
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064703
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixхотя чую щас набегут тут спецы и будут призывать сначала "изучать предметную область"да ладно, не настолько уж они и кровожадные :)
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064704
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, для нумерации записей в табличке у нас пост есть в FAQ-е - 7489347
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064710
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо что уделили мне столько времени.
Поделюсь программным кодом, которым можно на расстоянии управлять базой MySQL из своего приложения. В принципе не важно на чем вы программируете. Мне по душе просто VB6. В дебугере поэксперементировал без риска, и всяких неудобств. Ну и не нужно было даже промежуточного id для такой задачи. Добавил дополнительные поля: ид_предыдущей_страницы и ид_следующий.

Вот уже работающий код по индексации
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Private Sub Command13_Click()

  Dim Cnn As adodb.Connection, CmdCommand As New adodb.Command, f As Long, s_id As Long
  Dim Rubrika As Long, Oblast As Long, PopId2 As Long, PopId3 As Long, p As Long
  Set Cnn = New adodb.Connection
  Set Rec = New adodb.Recordset
  Cnn.open "DRIVER={MySQL ODBC 5.2 Unicode Driver};SERVER=" & PBServerSQL & ";PORT=" & PBPortServerSQL & ";DATABASE=" & PBNameBDSQL & ";UID=" & PBUserSQL & ";PWD=" & PBPasswSQL & ";OPTION=3;"
    Rec.CursorLocation = adUseClient
    Rec.CursorType = adOpenStatic
    Rec.LockType = adLockOptimistic
    CmdCommand.ActiveConnection = Cnn
    CmdCommand.CommandType = adCmdText
  
For Rubrika = 201 To 250
   CmdCommand.CommandText = "SELECT p.id, e.rating FROM partner_post p LEFT JOIN partner_post_extras e ON (p.id=e.news_id) WHERE category=" & Rubrika & " AND approve=1"
    Set Rec = CmdCommand.Execute() 'Обновляю все на сервері з власного ПК копіюється все що не сходиться на сервер
  If Not Rec.EOF Then
    For Oblast = 1 To 25
     CmdCommand.CommandText = "SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM partner_post p LEFT JOIN partner_post_extras e ON (p.id=e.news_id) WHERE category=" & Rubrika & " AND approve=1 AND PLandO='" & Oblast & "' ORDER BY money DESC, date ASC"
      Set Rec = CmdCommand.Execute()
      PotId2 = 0
      s_id = 0
      p = 0
      
      Do Until Rec.EOF
        
        If p > 0 Then
          CmdCommand.CommandText = "UPDATE partner_post SET prevlink=" & PopId2 & ", nextlink=" & Rec("id").value & " WHERE id=" & s_id
          CmdCommand.Execute
        End If
        
        PopId2 = s_id
        s_id = Rec("id").value
        
        p = p + 1
        f = f + 1
        
        DoEvents: Caption = f & " - " & Rubrika & " : " & Oblast & " : " & s_id & " - " & Rec("Title")
        Rec.MoveNext
      Loop
      
      If p > 0 Then
        CmdCommand.CommandText = "UPDATE partner_post SET prevlink=" & PopId2 & " WHERE id=" & s_id
        CmdCommand.Execute
      End If
      
    Next
  End If
Next
MsgBox "END"
End Sub



Теперь, зная что он работает, переделаю его на PHP.

нумеровать в лоб - не знал такого. Очень интересно.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064714
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Ну и не нужно было даже промежуточного id для такой задачи. Добавил дополнительные поля: ид_предыдущей_страницы и ид_следующий.Ну вот, а могли бы обойтись одним полем.
И его можно было бы использовать для сортировки в запросе из начального поста.
Впрочем, дело хозяйское. Делайте как удобнее.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064716
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159нумеровать в лоб - не знал такого. Очень интересно.Кстати, по тому же принципу можно и два поля заполнять. Понадобится всего два запроса вместо пачки. Теоретически можно и в один запихать, но работать он будет сильно дольше, так что смысла нет.
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064736
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот. Может кто захочет тоже такой фигней пострадать. Перевел код в PHP. Все работает
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
}if(isset($_GET['мойсекрет']) AND isset($_GET['мойсекрет2'])){
	if($_GET['мойсекрет2']=='код'){
		for ($Rubrika = 201; $Rubrika <=250; $Rubrika++){
			$row = $db->super_query( "SELECT p.id, e.rating FROM partner_post p LEFT JOIN partner_post_extras e ON (p.id=e.news_id) WHERE category=".$Rubrika." AND approve=1" );
			if($row){
				for ($Oblast = 1; $Oblast <= 25; $Oblast++){
				
					$PotId2=0;$s_id=0;$p=0;
					
					$TReIndex = $db->query("SELECT p.id, p.category, e.rating FROM partner_post p LEFT JOIN partner_post_extras e ON (p.id=e.news_id) WHERE category=".$Rubrika." AND approve=1 AND PLandO='".$Oblast."' ORDER BY money DESC, date ASC");

					while ( $row = $db->get_row( $TReIndex )){
						if($p>0)$db->super_query("UPDATE partner_post SET prevlink=".$PopId2.", nextlink=".$row["id"]." WHERE id=".$s_id);
						$PopId2=$s_id;$s_id=$row["id"];$p++;
					}
					if($p>0)$db->super_query("UPDATE partner_post SET prevlink=".$PopId2." WHERE id=".$s_id);
				}
			}
		}
	 echo 'ok';
	}
	die();
}
...
Рейтинг: 0 / 0
Следующая и предыдущая страница
    #39064763
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
UPDATE partner_post p LEFT JOIN partner_post_extras e ON p.id=e.news_id
SET prevlink=(SELECT LEAST(@pl,1000000+(@pl:=id)) FROM (SELECT @pl:=-1) t)
WHERE category=".$Rubrika." AND approve=1 AND PLandO='".$Oblast."'
ORDER BY money DESC, date ASC;

UPDATE partner_post p LEFT JOIN partner_post_extras e ON p.id=e.news_id
SET prevlink=(SELECT LEAST(@pl,1000000+(@pl:=id)) FROM (SELECT @pl:=-1) t)
WHERE category=".$Rubrika." AND approve=1 AND PLandO='".$Oblast."'
ORDER BY money ASC, date DESC;


Мог напутать в деталях, вот PoC - http://sqlfiddle.com/#!9/eb3de8/1
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Следующая и предыдущая страница
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]