Станислав

Станислав
Рейтинг
258
Регистрация
27.12.2009

Без вас бы не справился =) Спасибо!

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 != 8722
GROUP 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, о такой выборке вы писали? Или я тут уже отсебячины нагородил? 🤪

admak:
какя-то каша в запросе.
TABLE1 там не нужна

Она нужно, так как нужно именно их нее выдернуть данные, в данном случае (title и id)

post_id, tag_id - PK (полагаю)

Нет. 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 идут

и плюсом

Эти два поля уникальные в данной таблицу.

ivan-lev:
А зачем столько городить?
Зачем делать SELECT *, если, например, содержимое записи (TEXT) не нужен.
Зачем делать хитрые JOIN-ы, если запросы по PK выполняются в разы быстрее..
Показательно не количество запросов, а время их выполнения.

Это все понятно, это не мой запрос, я даже четко его разобрать не в силах, одна каша.

Знаю только то, что он был написан в 2007 году, наверное тогда это было нормой.

ivan-lev:
А самый быстрый запрос - тот, который не сделан.
На странице ведь тэги выводятся.. значит, полагаю, можно без запроса, уже в коде получить их ID-шники и сделать из них через запятую что-то вроде такого:
$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

ivan-lev:

Далее 2 "простых" запроса по ключу:

$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, тогда и проблем не будет в позиционировании блока

Snake800:
Конец года, гуглу нужны красивые цифры прибыли для акционеров и форбса.

Кстати тоже мысль не плохая, надо будет запомнить и в начале следующего года глянуть на изменения.

РСЯ зараза, все самое интересное да в таком формате предоставлять!

Xoma_204:
На мой сайтик сейчас заходит примерно 10-15 уникальных посетителей за сутки

Нагони еще хотя бы 5, там уже и разговор другой будет!

Всего: 1561