Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Следующая и предыдущая страница / 24 сообщений из 24, страница 1 из 1
29.09.2015, 16:48:47
    #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
29.09.2015, 16:57:03
    #39064422
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159предыдущую страницуПредыдущую страницу чего?
...
Рейтинг: 0 / 0
29.09.2015, 17:06:26
    #39064430
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
miksoftАндрей159предыдущую страницуПредыдущую страницу чего?
Пост, новость, блог, товар в интернет магазине, страница партнера, анкета пользователя - можно называть как угодно.

Нужно в страницу "Новости" (пусть будет новость) уже выдать ссилку на следующую новость и на предыдущую. А нам известно только id новости и все данные новости. А предыдущий запрос показывает не новость а список новостей. Если б мог узнать хотябы позицию в списке, то я бы просто изменил LIMIT н1 , н2 и все. А так не знаю. Понятное дело, что можно давать эту переменную вместе с ссилкой, но тогда поисковые системы начнут наново индексировать, кроме того появится множество зеркальных страниц. Понимаете задачу?
...
Рейтинг: 0 / 0
29.09.2015, 17:17:21
    #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
29.09.2015, 17:25:05
    #39064466
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
вот и я о том же. так выходит, что нужно делать дополнительный запрос, который сначала при помощи PHP
пройдеься в цыкле по всем id моего запроса и методом update сделает свой счетчик в дополнительное поле id2. А вот тогда я могу и пользваться уже тем способом что вы описали, только вместо news_date использовать id2, ну и текущий id2. Подцепить под CRON. Другого пути не вижу. Да и то можно готовый id следующего поста прописать в отдельное поле раз уж UPDATE пошел в ход. Не нужно будет потом делать два дополнительных запросов. Ладно. Попробую тогда так сделать. Спасибо
...
Рейтинг: 0 / 0
29.09.2015, 17:32:04
    #39064482
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159пройдеься в цыкле по всем id моего запроса и методом update сделает свой счетчик в дополнительное поле id2.А что, порядок сортировки всегда один и тот же? Или меняется от чего-то?
...
Рейтинг: 0 / 0
29.09.2015, 17:36:01
    #39064492
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Есть, кстати, обходной маневр - передавать номера соседних страниц через дополнительные параметры в url-е.
А чтобы не возникало дублей в индексах поисковиков, добавить каноническую ссылку .
...
Рейтинг: 0 / 0
29.09.2015, 19:06:56
    #39064596
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
miksoftАндрей159пройдеься в цыкле по всем id моего запроса и методом update сделает свой счетчик в дополнительное поле id2.А что, порядок сортировки всегда один и тот же? Или меняется от чего-то?
Порядок один. Сортировка будет менятся в зависимости от рейтинга пользователя. Само события (изменения рейтинга и накрученного (купленного рейтинга)) срабатывает и могу фиксировать в отдельное поле флаг=False. Таким образом можно будет частично делать обновления индексов незатрагивая записей, которые фактически никак не будут изменяться. Пару часиков посижу. Нужно сделать
...
Рейтинг: 0 / 0
29.09.2015, 19:10:14
    #39064598
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
miksoftЕсть, кстати, обходной маневр - передавать номера соседних страниц через дополнительные параметры в url-е.
А чтобы не возникало дублей в индексах поисковиков, добавить каноническую ссылку .
Отлично, но из поисковика всегда забрасывает не в каталог, а уже на отдельную страницу, и если так случится, то она не будет иметь никаких переменных. Ссылки не будут работать. Остается вариант только индексировать их самостоятельно.
...
Рейтинг: 0 / 0
29.09.2015, 19:14:29
    #39064603
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159Порядок один. Сортировка будет менятсяВы меня озадачили :)
Так один или будет меняться?
Андрей159в зависимости от рейтинга пользователяПользователя, который смотрит эти новости? Т.е. для меня порядок новостей один, для Вас другой?
...
Рейтинг: 0 / 0
29.09.2015, 19:17:09
    #39064609
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159Отлично, но из поисковика всегда забрасывает не в каталог, а уже на отдельную страницу, и если так случится, то она не будет иметь никаких переменных.А какие могут быть соседние страницы, если в этот момент мы не знаем порядка сортировки? Или знаем?
...
Рейтинг: 0 / 0
29.09.2015, 19:23:50
    #39064614
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Знаем. есть каталог услуг. Там я доделал область, и остальное осталось - каталоги (каталог услуг). Позицию в каталоге покупают за сколько хотят (свободные торги) или с помощью рейтинга (репосты - "рекомендации"), но рейтинг в сотни меньше имеет веса.
Юзер заходит в каталог, выбирает область, потом вид деятельности и там уже видит всех отсортированных. По цене не буду делать сортировку. Для этого есть отдельно поиск с фильтром. важно чтоб не потеряться в поисковике. В яндекса и гугла правила хоть очень простые, но строгие. Можно маленькую деталь опустить, а она оказывается очень важная. По этому очень осторожно и дипломатично нужно с кодом обходиться - с уважением.
...
Рейтинг: 0 / 0
29.09.2015, 19:30:38
    #39064622
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159ЗнаемНу тогда, наверное, предрассчитанное поле с сортировкой будет оптимальным выходом. По крайней мере, если у вас показ новостей(услуг) происходит намного чаще, чем меняется этот порядок сортировки.
...
Рейтинг: 0 / 0
29.09.2015, 19:41:35
    #39064629
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159,

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

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

"Нормализатор" это что ? Типа авторская программа на другом языке, которая работает отдаленно на компе и имеет всю копию базы данных ? У меня есть такая на Visual Basic 6 + база данных Access. Тоже думал над этим. И комп на станции круглосуточно работает, можно нагрузить. Вероятно даже что так будет эффективней. Но пометку изменений все же буду оставлять в качестве заявления что нужно переиндексировать. Вы мне подкинули идею
...
Рейтинг: 0 / 0
29.09.2015, 20:49:05
    #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
29.09.2015, 21:33:00
    #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
29.09.2015, 22:15:44
    #39064703
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Lumixхотя чую щас набегут тут спецы и будут призывать сначала "изучать предметную область"да ладно, не настолько уж они и кровожадные :)
...
Рейтинг: 0 / 0
29.09.2015, 22:16:53
    #39064704
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Кстати, для нумерации записей в табличке у нас пост есть в FAQ-е - 7489347
...
Рейтинг: 0 / 0
29.09.2015, 22:26:37
    #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
29.09.2015, 22:31:05
    #39064714
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159Ну и не нужно было даже промежуточного id для такой задачи. Добавил дополнительные поля: ид_предыдущей_страницы и ид_следующий.Ну вот, а могли бы обойтись одним полем.
И его можно было бы использовать для сортировки в запросе из начального поста.
Впрочем, дело хозяйское. Делайте как удобнее.
...
Рейтинг: 0 / 0
29.09.2015, 22:34:12
    #39064716
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Следующая и предыдущая страница
Андрей159нумеровать в лоб - не знал такого. Очень интересно.Кстати, по тому же принципу можно и два поля заполнять. Понадобится всего два запроса вместо пачки. Теоретически можно и в один запихать, но работать он будет сильно дольше, так что смысла нет.
...
Рейтинг: 0 / 0
29.09.2015, 23:30:43
    #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
30.09.2015, 01:11:44
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Следующая и предыдущая страница / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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