пурга какая-то получается (Добавление)
поясню для чего нужно. Сайт на комерческой cms с ЧПУ. Исходный htacess в первом посте. Установили дополнительный модуль, реализующий личный блог каждого зарегистрированного пользователя. Все урл на сайте в стиле site.org/path/to/page, урлы пользователей site.org/users/userid, а урлы блогов в новом модуле site.org/blog?id=userid а мне надо сделать что бы были /users/userid/blog
Может есть еще пути решения? Редирект не канает. Пользователь не должен видеть в браузере урлов типа site.org/blog?id=userid
KingStar, internal Server Error при запросе /request Зацикливается. Если поставить RewriteRule ^request - [L], то тогда все срабатывает, кроме RewriteRule ^(.*)$ /index.php
А это тоже важно. request должен обрабатывать index.php, как и любой другой запрос..
Нужно добавить правило, что-бы любую ссылку в которой содержится request направило на /request
например site.org/user/1/request -> site.org/request site.org/user/1?request -> site.org/request
Вроде тривиальная задача, но бьюсь уже второй день. Большинство манипуляций вроде RewriteRule ^.*request.*$ /request либо ни как не работают, либо приводят к зацикливанию с internal server error
Такой вопрос. Возможно ли отсортировать многомерный массив array(array(1,2),array(1,2,3),array(1,2,3,4)), по размеру подмассивов? Или скажем, по длине ключа. Может есть возможность отсортировать несколько разных массивов по размеру?
$sql='SELECT * FROM talks WHERE identy ='.($id0>$id1?$id1.'&'.$id0:$id0.'&'.$id1)
В поле identy будут храниться значения типа 12&14, 45&87 Меньший id всегда на первом месте, что-бы не делать OR в запросе. Ну и индекс безусловно по identy.
Выскажите мнение по поводу этой хни, потянет для сельской местности?
Хотите еще одну? Хотелось бы оптимизировать нижеследующий запрос, если это возможно. На той-же таблице в 10000 записей он отрабатывает за 0.07 сек. В принципе, этого достаточно, но если возможно такой запрос оптимизировать, было бы очень хорошо!!)
Расскажу что он делает - он выбирает темы форума в порядке последнего добавленного сообщения с информацией о авторе, создавшем тему и пользователе, написавшем последнее сообщение. Подзапрос используется для инвертирования таблицы, иначе mysql упорно не желает выбирать последние сообщения (берет первое найденное).
Необходимо разработать систему онлайн-общения на сайте.
Хочу сделать так. Для общения двух человек - одна строка в таблице, поле longtext для текста переписки + поля для айдишников общающихся юзеров.
Нужно как-то придумать что-бы оба айдишника запихать в одно поле. Ибо форму общения может вызвать как один пользователь, так и другой и запрос что для одного, что для другого должен выглядеть одинаково, примерно как-то так:
Нужно что-бы, например, для $id=12 и $id=14, выбралась одна и та же запись (общаются пользователи с id 12 и 14).
Что можно придумать для Mysql MyISAM? (Добавление)
Мне пока ни чего умнее
В голову не идет (Добавление)
Ой ой ой. Напортачил. Тут используется связка. Айди вызывающего пользователя + айди вызываемого пользователя. Т.е. в запрос попадает эта связка.
EuGen, дело не в том, выбирать forum_id или id, дело в том что вся основная текстовая информация содержится в поле json с type='forum' и нужно выбирать именно его, а не id или forum_id. В вашем запросе дело в WHERE который, я так понимаю, (ни разу не встречал параметр в where без сравнивания) не должен являться NULL, что позволяет выбрать всю таблицу, совершить подсчет по всей таблице, но не выбрать записи c type=forum и необходимым json-текстом, без использования join. По крайней мере WHERE id , WHERE type=forum и т.п. манипуляции ни к чему не привели ) (Добавление)
Вот такой запрос то что нужно и быстро
mysql>SELECT f.id, f.type, COUNT(DISTINCT a.id)AS posts_count, COUNT(DISTINCT a.topic_id)AS topics_count FROM test.Forum a JOIN test.Forum f ON f.id = a.forum_id WHERE a.forum_id GROUPBY a.forum_id;
mysql>SELECT f.id,f.type,(SELECT COUNT(*)FROM test.Forum f0 WHERE f0.forum_id = f.id AND f0.type ='post')AS posts,(SELECT COUNT(DISTINCT(f0.topic_id))FROM test.Forum f0 WHERE f0.forum_id = f.id AND f0.type ='post')AS topics FROM test.Forum f WHERE f.type ='forum';
+------+-------+-------+--------+
| id | type | posts | topics |
+------+-------+-------+--------+
| 1 | forum | 2666 | 11 |
| 2 | forum | 2740 | 16 |
| 15 | forum | 2706 | 10 |
| 5028 | forum | 954 | 15 |
| 5029 | forum | 961 | 16 |
+------+-------+-------+--------+
5 rows INSET(0.06 sec)
mysql>SELECT id, type, COUNT(DISTINCT id)AS posts_count, COUNT(DISTINCT topic_id)AS topics_count FROM test.Forum WHERE forum_id GROUPBY forum_id;+------+------+-------------+--------------+
| id | type | posts_count | topics_count |
+------+------+-------------+--------------+
| 7 | post | 2666 | 11 |
| 3 | post | 2740 | 16 |
| 16 | post | 2706 | 10 |
| 5030 | post | 954 | 15 |
| 5031 | post | 961 | 16 |
+------+------+-------------+--------------+
5 rows INSET(0.01 sec)
Он выбирает посты, а не форумы. Из строки поста я название форума не вытяну
mysql>SELECT f.id,f.type,(SELECT COUNT(*)FROM test.Forum f0 WHERE f0.forum_id = f.id AND f0.type ='post')AS posts,(SELECT COUNT(DISTINCT(f0.topic_id))FROM test.Forum f0 WHERE f0.forum_id = f.id AND f0.type ='post')AS topics FROM test.Forum f WHERE f.type ='forum';
+------+-------+-------+--------+
| id | type | posts | topics |
+------+-------+-------+--------+
| 1 | forum | 2666 | 11 |
| 2 | forum | 2740 | 16 |
| 15 | forum | 2706 | 10 |
| 5028 | forum | 954 | 15 |
| 5029 | forum | 961 | 16 |
+------+-------+-------+--------+
5 rows INSET(0.05 sec)
mysql>SELECT forum.id, forum.type, COUNT(DISTINCT forum_posts.id)AS posts_count, COUNT(DISTINCT forum_topics.topic_id)AS topics_count FROM test.Forum forum LEFTJOIN test.Forum AS forum_posts ON forum.id=forum_posts.forum_id AND forum_posts.type='post'LEFTJOIN test.Forum AS forum_topics ON forum.id=forum_topics.forum_id AND forum_topics.type='post'GROUPBY forum.topic_id HAVING posts_count>0;
+------+-------+-------------+--------------+
| id | type | posts_count | topics_count |
+------+-------+-------------+--------------+
| 1 | forum | 2666 | 11 |
| 2 | forum | 2740 | 16 |
| 15 | forum | 2706 | 10 |
| 5028 | forum | 954 | 15 |
| 5029 | forum | 961 | 16 |
+------+-------+-------------+--------------+
5 rows INSET(1 min 6.23 sec)
Предыдущая таблица была расширена. Возможно, результат изменился бы если бы таблица изначально так формировалась. В любом случае в данном конкретном случае для меня очевиден выбор в пользу подзапросов.
Оно и понятно - данные "заполнены" скриптом автоматически (у меня по 2000 тысячи сообщений в 3-4 темах), стало быть в данном случае подзапрос дает выигрыш. Однако же в реальной ситуации кардинальное число ключа будет много лучше (я бы даже сказал, в корне лучше), и в общем случае прирост от JOIN будет куда выше.
Хотите сказать что если модифицировать скрипт, который будет добавлять 1топик со 100 постами рандомно (эмуляция реального форума) и провести тест, результаты изменятся?
Я щас попробую
Я думаю что MyISAM специально создан для таких извращений
Кстати по поводу извращений
Возвращаясь к первому посту хочу отметить что есть способ одним подзапросом вытащить оба значения:
(SELECT CONCAT_WS(':',COUNT(*),COUNT(DISTINCT(f0.topic_id)))FROM Forum f0 WHERE f0.forum_id = f.id AND f0.type ='post')AS posts_&_topics,
AS topics
FROM Forum f
WHERE f.type ='forum'
Врятли это поможет выиграть в производительности, ведь потом придется делать explode или substr какой-нибудь. А можно внутри запроса результат подзапроса присвоить переменной, а потом над переменной SUBSTRING_INDEX