В этой заметке я буду собирать часто попадающиеся мне в ходе сайтостроительных задач SQL-запросы.

Удаление строк из таблицы на основании подзапроса (subquery), в котором присутствуют поля как из данной таблицы, так и из других:

DELETE ua FROM url_alias ua
JOIN node n ON n.type = 'torgovya_marka'
AND ua.alias LIKE 'content/%'
AND ua.source LIKE CONCAT( 'node/', n.nid )

Описанный запрос удалит из таблицы url_alias все строки, в которых поле alias начинается с 'content/', а поле source при этом содержит результат конкатенации 'node/' и идентификаторы записей nid из таблицы node, у которых поле type содержит значение 'torgovya_marka'. Другими словами, запрос выберет из таблицы node все идентификаторы строк, у которых поле type = 'torgovya_marka' и подставит их в родительский запрос, предварив каждый идентификатор строкой 'node/'. А далее будет произведена проверка полей source и alias редактируемой таблицы url_alias в соответствии с указанными условиями и выполнено удаление строк, которые этим условиям удовлетворяют.

Уникализация таблицы БД или удаление одинаковых строк:

ALTER IGNORE TABLE table ADD UNIQUE INDEX(column);

Импорт большого дампа через консоль:

CREATE DATABASE [DBNAME];
USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Сортировка по нескольким полям с условием, что предпочтение отдается НЕ нулевым (не NULL) значениям:

...order by COALESCE(p.products_date_available, p.products_date_added) desc

Поиск одинаковых значений в колонке:

SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;

Update и join в одном запросе:

UPDATE t1 LEFT JOIN t2 ON t2.id = t1.id SET t1.col1 = newvalue WHERE t2.id IS NULL

Информация о таблице с индикатором, какое из полей является первичным ключом (Primary Key, pk) для SQLite:

PRAGMA table_info(myTable)

Регулярное выражение в запросе:

SELECT url_alias_id
FROM oc_url_alias
WHERE query REGEXP 'product_id=[0-9]+'
   AND CAST(RIGHT(query, LENGTH(query) - 10 -
   LOCATE('product_id=', query)) AS SIGNED INTEGER)
   NOT IN (select product_id from oc_product)

Тримминг (удаление пробелов в начале и конце) поля:

UPDATE `oc_product_description` SET name=TRIM(name)

DELETE ... SELECT:

DELETE FROM posts WHERE id IN (
  SELECT * FROM (
    SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
  ) AS p
)

Чтобы не возникала ошибка при truncate foreign key constrained table:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
SET FOREIGN_KEY_CHECKS = 1;

Подсчет корректного кол-ва строк COUNT(*), когда в запросе есть LEFT JOIN:

SELECT COUNT(DISTINCT p.product_id) AS total FROM... LEFT JOIN...

Поиск по числовым выражениям (что-то типа is_numeric , is_number):

... WHERE concat( '', model * 1 ) = model

Apache в плане потребления ресурсов неумолим. Поэтому уже давно практикуется вариант, когда на нем висит обработка динамической части сайтов, а вся статика ложится на плечи экономного и шустрого Nginx. В нашем случае, алгоритм работы будет состоять из приема HTTP-запроса от пользователя средствами Nginx, распознавание - запрашивается ли php-скрипт. Если да, запрос передается на Apache. В противном случае, работу продолжает Nginx. Настроить такую схему можно за пару минут.

В связи со сменой хостинг-панели на сервере с ISPConfig на ZPanel пришлось заменить и сервер входящей почты с Courier на Dovecot, поскольку Zpanel поддерживает работу только с последним. Раньше почтовая связка работала через вирусный сканер Amavis, который подключал SpamAssassin для определения спамности письма. Тот помечал спамное письмо, модифицируя тему (subject) по шаблону ***SPAM***. Потом письмо направлялось во Входящие. Фильтрация помеченных писем производилась не на сервере, а уже у меня на локальной машине, после получения. Это было удобно по той простой причине, что некорректно распознанные письма могли попасть в спам незаслуженно, но при этом они не терялись и не удалялись. И в случае обнаружения, я их быстро мог восстановить.

Если на сервере Apache работает с PHP через FastCGI, для использования становятся недоступными $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] , поскольку PHP просто больше не получает соответствующие значения от сервера. Для того, чтобы все-таки была возможность пользоваться этими переменными в скриптах с авторизацией через модуль Apache, придется кое-что дописать.

Обновил ISPConfig на сервере до версии 3.0.5.2 и столкнулся с проблемой: сайты отображаются, как положено, а вот вход в админку ISPConfig не фурычит. Оказалось, что последние версии панели отказываются работать с PHP, если он установлен как модуль к Apache (mod_php). Из соображений безопасности разработчики решили отказаться от него. Пришлось ставить FCGI. На основании вытекших отсюда проблем пришлось менять шаблоны виртуальных хостов, поскольку с FCGI нельзя прописывать директивы php_flag, php_value и т.п. Также для каждого сайта пришлось поменять механизм работы с PHP: вместо mod PHP на FCGI.

joomla рассылка А вы в курсе, что фреймворк от Joomla очень удобно использовать для быстрого решения небольших задач? Разработчики Жумлы проповедуют подход MVC, однако для простых приложений, например, как в данном случае - автоматизация подготовки выпуска - вполне можно обойтись одним-двумя файлами, задействовав лишь удобный механизм работы с базой данных, который предоставляет Joomla.

Задача: есть набор ключевых слов, которые наличествуют в тексте страницы и прописаны в мета-теге keywords. Как их автоматически выделить на странице посредством тега <strong>, учитывая, что слова имеют различные окончания, а также могут иметь дефисы.

habari-with-taglineСегодня мы поговорим о блоговом движке Habari, относительно недавно получившем известность. На суахили сия абракадабра означает приветствие и переводится «что нового?» - очень подходящее название для личной новостной платформы, к тому же, бесплатной.

Наверх