В этой заметке я буду собирать часто попадающиеся мне в ходе сайтостроительных задач 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):
Если на сервере Apache работает с PHP через FastCGI, для использования становятся недоступными $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] , поскольку PHP просто больше не получает соответствующие значения от сервера. Для того, чтобы все-таки была возможность пользоваться этими переменными в скриптах с авторизацией через модуль Apache, придется кое-что дописать.
Задача: есть набор ключевых слов, которые наличествуют в тексте страницы и прописаны в мета-теге keywords. Как их автоматически выделить на странице посредством тега <strong>, учитывая, что слова имеют различные окончания, а также могут иметь дефисы.
Полезно иметь в своем арсенале инструментарий, который можно легко применять из приложения в приложение для решения широкого круга задач, не касаясь кода этого инструментария и вне зависимости от характера самих задач. В ходе разработки всевозможных приложений программистами был выделен ряд абстрактных программных решений, которые, как шаблоны или трафареты, можно свободно приложить к конкретно стоящей проблеме и вычертить по ним готовый продукт.
Нижеприведенные широко применяющиеся шаблоны проектирования (design patterns) могут быть весьма полезны в больших приложениях, в которых изменение какого-то куска кода может сильно повлиять на другие его части и на работу всей системы в целом. Дабы этого не происходило и была выделена группа шаблонов, которая сводит к минимуму в приложении тесную связь между компонентами.
Простейшая обертка-класс для работы с MySQL, призванная помочь тем, кому надоело постоянно писать INSERT... , SELECT... , UPDATE и т.д. Этот класс довольно старенький, я его часто применял при разработке своего Интернет-магазина автолитературы. Хоть и задачи он выполняет несложные, его пользу трудно переоценить. Работать будет и на древнейших версиях PHP.
Этот класс, реализующий корзину покупок на сайте, я когда-то успешно применил при создании собственного интернет-магазина автомобильной литературы. Он работает и на старинных версиях PHP.
Очень часто встречается задача преобразования массива данных, например, категорий в дерево (структуру с неограниченным уровнем вложенности). В этом случае обычно каждый элемент массива содержит данные о родителе. В случае с категориями это ID категории-родителя (parent).
Дано: массив, у которого ключи - ID категорий, а значения - объекты-записи, одно из свойство которых - parent, указывающее на родительскую категорию. Задача: сначала преобразовать массив данных в дерево, а затем вывести это дерево на страницу в виде списка с неограниченным уровнем вложенности.
Задача: отсортировать выдачу из БД по числу вхождений тега у похожих материалов. К примеру, компонент K2 для Жумлы показывает похожие материалы в порядке их публикации. А нужно так: если у некоторых материалов совпадает бОльшее число тегов, чем у других, то они идут в первую очередь. Т.е. первым среди похожих материалов идет тот, у которого 3 тега совпадает с текущим материалом на странице, следующим идет - у которого 2 и т.д.