[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос с неточным совпадением
Страницы: 1, 2
medvedeva
Приветствую форумчан!

Есть такой запрос, выбирающий в базе случайные новости из той же категории, что и новость, в которой они выводятся (что-то вроде похожих новостей, related, но проще гораздо). Трабл весь в том, что новость может иметь несколько категорий, и в таком случае этот запрос осуществляет выборку новостей только с аналогичным набором категорий, как и у основной новости, в которой делается вывод.
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE `category` = '{$row['category']}' ORDER BY RAND() LIMIT 16");
Конкретно, я понимаю, что эта часть запроса отвечает за выборку новостей из определённой категории:
category` = '{$row['category']}'
Но вот вопрос, как сделать, чтобы выборка осуществлялась не по точному совпадению, например id: 12,18,31, а чтобы вывелись новости, содержащие хотя бы одну из категорий 12,18 или 31 ?

В самом PHP скрипте встречаются еще такие моменты:
		$category_id = $row['category'];
	if( ! $row['category'] ) {
$my_cat = "---";
$my_cat_link = "---";
} else {

$my_cat = array ();
$my_cat_link = array ();
$cat_list = explode( ',', $row['category'] );
		$category_id = intval( $row['category'] );
Прикрепляю к посту и полную версию кода...

Отсутсвие знаний не даёт мне возможности самой разобраться, хоть и пыталась найти инфу в доке по mysql. Пересмотрела типовые запросы, ничего подобного не нашла :(

Прошу помощи знатоков :unsure:

Благодарю за внимание.
С уважением, Анастасия.
medvedeva
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE `category` = '{$row['category']}' ORDER BY RAND() LIMIT 16");

как-то бы заменить на
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE `category` = 'explode( ',', $row['category'] )' ORDER BY RAND() LIMIT 16");
:rolleyes: чтоли... user posted image
netruxa
у Вас в $row['category'] уже список категорий через запятую?
если да, то сработает так
//$row['category']='1,2,134';
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE `category` in '$row['category'] ' ORDER BY RAND() LIMIT 16");


_____________
ввв.парсер.рф - онлайн система проверки позиций Вашего сайта в поисковиках. Для форумчан 100 рублей на счет.
medvedeva
netruxa, благодарю Вас за помощь, но после замены = на IN получила следующее:

MySQL error in file: /engine/modules/show.full.php at line 565
Error Number: 1064
The Error returned was:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''17,22' ORDER BY RAND() LIMIT 16' at line 1

SQL query:
SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE `category` in '17,22' ORDER BY RAND() LIMIT 16
netruxa
упс, сорри, давно с этим оператором не работал
попробуйте так
SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE `category` in (17,22) ORDER BY RAND() LIMIT 16


_____________
ввв.парсер.рф - онлайн система проверки позиций Вашего сайта в поисковиках. Для форумчан 100 рублей на счет.
medvedeva
in ({$row['category']})
таким образом всё заработало и задача приобрела статус решенной :P

netruxa, спасибище огромное за помощь! :rolleyes: Теперь в аналогичных ситуациях буду знать разницу между
= ''
и
IN ()


user posted image
netruxa
да не за что
вот только Ваше ORDER BY RAND() LIMIT 16 мне совсем не нравится
ORDER BY RAND() само по себе сильно грузит базу, да еще 16 раз...
Посещалка то большая? Если больше 1000 в сутки, то уже следует искать новые решения

_____________
ввв.парсер.рф - онлайн система проверки позиций Вашего сайта в поисковиках. Для форумчан 100 рублей на счет.
Guest
(тут должен был быть смайлик бьющийся головой об стену)

1) хранение списка категорий в одном поле через запятую - это большое "нет-нет"

2) задача решена частично. По этому запросу будут находиться только новости относящиеся к одной категории, т.е. имеющие только одно число в поле "category". Если в приведенном выше примере есть новости относящиеся к двум или более категориям (например: 11,17 или 21,22 или 11,17,22), то они никогда не попадут в выборку "IN (17,22)"

3) фраза про "16 раз" вообще за гранью добра и зла....

Valick
Цитата
1) хранение списка категорий в одном поле через запятую - это большое "нет-нет"

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


_____________
Стимулятор ~yoomoney - 41001303250491
medvedeva
netruxa, далека от PHP, и уж тем более от SQL :(
Цитата
ORDER BY RAND() само по себе сильно грузит базу, да еще 16 раз...
Начинаю понимать, это не случайный вывод 16 новостей, а случайный вывод одной новости 16 раз, так чтоли? Тобишь есть еще и вероятность, что новость будет выведена несколько раз повторно? Подскажите, будьте добры, как организовать запрос лучше?
Цитата
Посещалка то большая? Если больше 1000 в сутки, то уже следует искать новые решения
Посещалки почти нет, но промониторила, действительно этот запрос сильно грузит проц и никак не кешируется. Конечно, могу перейти в базовый метод вывода похожих новостей, он весьма продуман в DLE, но суть в том, что там полнотекстовый поиск используется, а у меня основная инфа, по которой новости будут похожи, находится в заголовке (названии) новости.

Guest, очень мило с Вашей стороны дать дельные советы.
1) таков DLE;
2) странно, но всё работает как надо, проверила-перепроверила, выводятся любые новости при малейшем совпадении, например если основная имеет 11,16,19 - выводятся как отдельно 11 и 19, так и 23,16,19 и 11,42,98;
3) я вообще думала что LIMIT 16 это имеется ввиду единоразовый выбор 16 новостей из всего перемешанного списка ORDER BY RAND().

PS: видимо таки придётся воспользоваться штатными средствами движка по related_news, запрос там такой:
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE id IN({$row['related_ids']}) ORDER BY id DESC");
если что и грузит, то незаметно при моей, скромного объёма, базе.
medvedeva
Цитата
1) хранение списка категорий в одном поле через запятую - это большое "нет-нет"

Эмм, а как тогда, отдельной таблицей вида
IDкатегории - IDвсех новостей в ней

?
medvedeva
Цитата
видимо таки придётся воспользоваться штатными средствами движка по related_news

Но всё равно хотелось бы делать случайный вывод при каждой перезагрузке страницы, это был бы примитивный аналог аякс кнопочки "показать еще похожие новости" laugh.gif
Guest
Цитата
2) странно, но всё работает как надо, проверила-перепроверила, выводятся любые новости при малейшем совпадении, например если основная имеет 11,16,19 - выводятся как отдельно 11 и 19, так и 23,16,19 и 11,42,98;

А "23,16,19" записано именно в таком порядке, или все же "16,19,23" ? Если второе - то, действительно, тут я недосмотрел. Будут найдены все новости где первое (и только первое) число является одним из искомых.

Цитата
3) я вообще думала что LIMIT 16 это имеется ввиду единоразовый выбор 16 новостей из всего перемешанного списка ORDER BY RAND().

Разумеется так и есть. И именно поэтому фраза про "16 раз" меня убила.

А правильная структура будет: отдельной таблицей {ID новости - ID категории}
medvedeva
Цитата
А "23,16,19" записано именно в таком порядке, или все же "16,19,23" ? Если второе - то, действительно, тут я недосмотрел. Будут найдены все новости где первое (и только первое) число является одним из искомых.

все же "16,19,23", но при этом работает всё на ура, как и хотела, только запрос сервак напрягает :angry:

Господа знающие, подскажите, возможно ли упростить запрос
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE `category` in ({$row['category']}) ORDER BY RAND() LIMIT 16");
а именно эту часть
ORDER BY RAND()
, чтобы функционал оставался тот же?
(вывод случайных новостей из категорий, которые содержит основная новость)

Положа руку на сердце, признаюсь, пробежалась по "оптимизация: ORDER BY RAND()", честно посмотрела там каждый метод (как баран на новые ворота), но опять таки
Цитата
Отсутсвие знаний не даёт мне возможности самой разобраться


Буду очень благодарна за любую помощь!
inpost
medvedeva
Псевдо рандомность делай. 1 раз дёргай, формируй около 50 записей, помещай в файл. После при повторном обращении - бери случайные 16 из 50 записей в файле. Своего рода кеширование на файлах.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.