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

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

phpatternsПолезно иметь в своем арсенале инструментарий, который можно легко применять из приложения в приложение для решения широкого круга задач, не касаясь кода этого инструментария и вне зависимости от характера самих задач. В ходе разработки всевозможных приложений программистами был выделен ряд абстрактных программных решений, которые, как шаблоны или трафареты, можно свободно приложить к конкретно стоящей проблеме и вычертить по ним готовый продукт. 

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

Простейшая обертка-класс для работы с MySQL, призванная помочь тем, кому надоело постоянно писать INSERT... , SELECT... , UPDATE и т.д. Этот класс довольно старенький, я его часто применял при разработке своего Интернет-магазина автолитературы. Хоть и задачи он выполняет несложные, его пользу трудно переоценить. Работать будет и на древнейших версиях PHP.

Очень часто встречается задача преобразования массива данных, например, категорий в дерево (структуру с неограниченным уровнем вложенности). В этом случае обычно каждый элемент массива содержит данные о родителе. В случае с категориями это ID категории-родителя (parent).

Дано: массив, у которого ключи - ID категорий, а значения - объекты-записи, одно из свойство которых - parent, указывающее на родительскую категорию.
Задача: сначала преобразовать массив данных в дерево, а затем вывести это дерево на страницу в виде списка с неограниченным уровнем вложенности.

Решение:

Задача: отсортировать выдачу из БД по числу вхождений тега у похожих материалов. К примеру, компонент K2 для Жумлы показывает похожие материалы в порядке их публикации. А нужно так: если у некоторых материалов совпадает бОльшее число тегов, чем у других, то они идут в первую очередь. Т.е. первым среди похожих материалов идет тот, у которого 3 тега совпадает с текущим материалом на странице, следующим идет - у которого 2 и т.д.

Наверх