В этой заметке я буду собирать часто попадающиеся мне в ходе сайтостроительных задач 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

Наверх