MySQL - полезные запросы
Речь пойдет о довольно часто встречающихся запросах, которые могут пригодиться в реальной жизни.
1. Имеется таблица, описывающая простое дерево:
CREATE TABLE tree(
IDItem INT AUTO_INCREMENT PRIMARY KEY,
Item VARCHAR(20) NOT NULL,
IDParent INT DEFAULT NULL);
Необходимо составить запрос, который выдал бы все листья этого дерева (т.е. т.е. записи, у которых нет потомков):
Решение:
SELECT table1.Item FROM
tree AS table1 LEFT JOIN tree as table2
ON table1.IDItem = table2.IDParent
WHERE table2.IDItem IS NULL;
Гранд идея такого запроса - листья не являются родителями для других записей.
2. Вы хотите одно из полей сделать уникальным, но система выдает сообщение об ошибке. Очевидно, в таблице имеются строки с одинаковыми значениями этого поля. Следующий запрос поможет найти повторяющиеся поля.
Решение:
SELECT name, count(name) as n1
FORM table
GROUP BY name
HAVING n1 > 1
3. Другая задача - удалить повторяющиеся записи в таблице. Такие записи могли возникнуть, если скрипт работает не совсем так, как вы задумывали. Обнаружив дыру и заделав ее, вам надо удалить несколько тысяч повторов. Предыдущий запрос лишь покажет наличие таких записей, но не удалит их.
Итак, пусть есть таблица, в которой первичный ключ автоинкрементный, и существуют повторы, скажем по полям IDProduct и IDCategory
ID IDProduct IDCategory
1 12 5
2 34 6
3 12 5
CREATE TABLE ProdCat (
ID int(11) NOT NULL auto_increment,
IDProduct int,
IDCategory int,
PRIMARY KEY (ID)
);
Решение:
ALTER IGNORE TABLE ProdCat ADD UNIQUE INDEX(IDProduct,IDCategory);
Идея запроса проста - составив новый индекс из двух полей, по которым есть повторы, и сделав его уникальным, мы получим выборку - туже таблицу, но только без повторяющихся записей.
P.S. Перед проведением этой операции лучше сделать бэкап таблицы