Без вас бы не справился =) Спасибо!
ivan-lev, собрал запрос, вроде бы все получилось, единственно указал еще post_id != 100
А то выводил такой же пост где я и нахожусь.
Работает быстро что очень радует, время выполнения 0.003-0.008 сек
Единственно что пришлось два раза перебирать выборку, первый раз получить ID всех тегов
SELECT `tag_id`FROM (`TABLE_3`)WHERE `post_id` = '8722'
Получил
Array( [0] => stdClass Object ( [tag_id] => 136 ) [1] => stdClass Object ( [tag_id] => 137 ) [2] => stdClass Object ( [tag_id] => 139 ) [3] => stdClass Object ( [tag_id] => 232 ) [4] => stdClass Object ( [tag_id] => 239 ) [5] => stdClass Object ( [tag_id] => 346 ) [6] => stdClass Object ( [tag_id] => 475 ) [7] => stdClass Object ( [tag_id] => 809 ) [8] => stdClass Object ( [tag_id] => 844 ) [9] => stdClass Object ( [tag_id] => 1501 ) [10] => stdClass Object ( [tag_id] => 3270 ))
Далее перебор
foreach($tag_id as $v) { $list_id[]= $v->tag_id; }$list_id = implode(',', $list_id);
Затем новый запрос
SELECT post_id, count(tag_id) as cnt FROM TABLE_3 WHERE tag_id <> 8722 AND tag_id IN ($list_id) AND post_id != 8722GROUP BY post_id ORDER BY 2 DESC LIMIT 0, 4
Array( [0] => stdClass Object ( [post_id] => 6070 [cnt] => 8 ) [1] => stdClass Object ( [post_id] => 6120 [cnt] => 7 ) [2] => stdClass Object ( [post_id] => 6118 [cnt] => 7 ) [3] => stdClass Object ( [post_id] => 7110 [cnt] => 7 ))
Далее опять перебор
foreach($list_query as $v) { $list_id_new[] = $v->post_id; } $list_id_new = implode(',', $list_id_new);
И уже последний запрос выводит то что мне нужно
SELECT id, title FROM table WHERE id in ($list_id_new)
Работает как и говорил быстро, если учесть что запрос из первого поста работал
0.1-0.3 сек
ivan-lev, о такой выборке вы писали? Или я тут уже отсебячины нагородил? 🤪
Она нужно, так как нужно именно их нее выдернуть данные, в данном случае (title и id)
Нет. unique выставлено
В TABLE_2 и TABLE_3
данных хранятся в таком виде
TABLE_2 - теги id | tag 1 | слово 2 | слово 2 3 | слово 3 4 | слово 4 5 | слово 5
TABLE_3 tag_id | post_id 1 | 100 2 | 100 3 | 100 4 | 100 5 | 100
Где 100 это TABLE.id = 100
по индексам
post_id и tag_id c INDEX идут
и плюсом
Эти два поля уникальные в данной таблицу.
Это все понятно, это не мой запрос, я даже четко его разобрать не в силах, одна каша.
Знаю только то, что он был написан в 2007 году, наверное тогда это было нормой.
$tag_ids = implode(',',$tag_ids); // строка вида '2,3,5,7';
Со страницы могу взять только ID поста, в смысле TABLE_3.id_post
А если получать ID всех тегов в посте, придется делать еще одну склейку таблиц с TABLE_2 (думаю смысла в этом нет) и быстрее наверное будет сделать отдельную выборку из TABLE_3, получив при этом все TABLE_2.id (все id тегов)
SELECT * FROM TABLE_3 WHERE id_post = 100
Тем самым получить уже все id_tag
$q1 = "SELECT post_id, count(tag_id) as cnt FROM TABLE_3 WHERE tag_id <> $post_id AND tag_id IN ($tag_ids) GROUP BY post_id ORDER BY 2 DESC LIMIT 0, 5";// 5 самых популярных //... Разбираем, получаем строку вида id1,id2,id3 и аналогично запрашиваем посты $q2 = "SELECT id, title FROM table WHERE id in ($post_ids)";
Побег кумекать, тестить :) спасибо!
Ну если еще варианты будут, тоже будет интересно поглядеть =)
И никто про ip сервера не подумал?
Часто на некоторых хостингах по IP сервера отображается сайт выставленный по умолчанию на сервере. К этому IP и прикрепляют домены что позволяет просматривать сайт с другого домена находящего в три девятом царстве.
Выход тут один, создать домен в панельке (любой, хоть абракадабра.на), после этого указать его доменом по умолчанию на сервере (то бишь при обращении по IP сервера, будет открываться этот домен (папка)). Затем создаем index.php в директории нового домена где и ставим редирект на основной домен.
Тут самым правильным решение будет обращение к js, тогда и проблем не будет в позиционировании блока
Кстати тоже мысль не плохая, надо будет запомнить и в начале следующего года глянуть на изменения.
РСЯ зараза, все самое интересное да в таком формате предоставлять!
Нагони еще хотя бы 5, там уже и разговор другой будет!