Чтобы не попасть под АГС я стараюсь продавать не более чем на 20% страниц и по 3-5 ссылок максимум. Пока полет нормальный (торгую давно). Поэтому с сайта с такими показателями можно ориентировочно поднимать около 800-1к рублей в месяц.
От темы сайта еще зависит.
Аналогично мой саттелит начало колбасить последние пару тройку недель схожим образом: пропадает до 99% страниц из индекса, потом все возвращается.
Что я думаю:
- Похоже на глюк все же
- Может быть действительно какой-то новый фильтр, в задачи которого в частности входит затруднение продажи ссылок с такого сайта :)
Хм, Вы хотите решить это только средствами mysql?
Я обычно такие вещи объединяю на стороне движка, т.к как сказал Alexius пересечение в mysql получить сложно и часто не оптимально. Для программной склейки можно использовать какой-то уникальный ключ или суррогатный md5 от данных строчки, к примеру.
Попробуйте так:
SELECT DISTINCT * FROM objects AS ...
(SELECT `number`, `title`,
`description`, `alt`,
`mini_img`
FROM
`material`
LIMIT 3)
UNION ALL
(SELECT
`number`, `title`,
`service`
LIMIT 1)
Книги еще:
Self-Indexing Inverted Files for Fast Text Retrieval (Alistair Moffat, Justin Zobel, February 1994)
Machine Learning in Automated Text Categorization (FABRIZIO SEBASTIANI)
Modern Information Retrieval (Ricardo Baeza-Yates, Berthier Ribeiro-Neto)
ps. есть pdf ки, если нужны пишите в личку.
Можно не менять структуру, но снизить сложность до 1 прохода по списку. Для этого правда нужно ввести отдельный индекс (сортированный список), в котором проиндексировать каждый каталог со списком всех своих чилдов, что-то типа:
categoryA, categoryB
categoryA, categoryC
categoryA, categoryD
..
Такой индекс можно рассчитывать заранее и хранить в отдельной таблице или еще как.
Имея дело с деревом adjacency list от рекурсии можно избавится только вот такими ухищрениями, которые имеют свою цену. Например, более сложное обновление каталогов.
adrin02, как я понимаю Вам нужно посчитать кол-во новостей в каждой из категорий. При этом новость может быть в одной, двух или сразу трех категориях?
Запрос
SELECT COUNT(*) FROM news WHERE cat=cat.id OR cat2=cat.id OR cat3=cat.id
скорее всего будет типа ALL независимо от индексов, т.е скан всех записей в таблице. При росте кол-ва записей в news все будет хуже и хуже работать.
Могу посоветовать только 2 варианта оптимизации:
1. вынести категории новостей в отдельную таблицу, что-то типа
create table news_category (
category_id int(11) unsigned not null,
news_id int(11) unsigned not null,
key (category_id, news_id)
) Engine=..
При добавлении новости вписывать 1-3 строчки в эту таблицу. При удалении удалять. При изменении категории обновлять.
Тогда посчитать кол-во новостей в каждой категории можно примерно так:
select c.id, count(*) from categories c inner join news_category nc on nc.category_id = c.id group by c.id;
Запрос будет использовать индексы по categories.id и индекс из news_category, это всяко быстрее чем полный скан таблицы.
2. В categories добавить новое поле типа news_counter и изменять его при добавлении/удалении новости, как в топике уже советовали.
Зачем вы делаете stripslashes($_POST["button_name"]); ?
Включена опция magic_quotes_gpc? Ее лучше отключить, она deprecated с php 5.3 и в php 6 будет убрана.
1. В самом SQL запросе сделайте экранирование всех параметров (может помочь исправить Вашу ошибку и заодно SQL injection :)
button_name = '$button_name' -> button_name = '".mysql_real_escape_string($button_name)."'
...
2. После этого echo '<p>Ошибка обнавления в базе!</p>';
добавьте echo mysql_error();
ps. Еще остается потенциальная уязвимость типа XSS, даже в админке не стоит расслабляться имх.
А у вас и есть JOIN (INNER), просто формат записи у него такой.
Наберите EXPLAIN SELECT ... и дальше весь код и можно в личку, помогу чем смогу.