DELIMITER //
DROP FUNCTION IF EXISTS T_CUR //
CREATE DEFINER = CURRENT_USER FUNCTION T_CUR()
RETURNS VARCHAR(1024) CHARSET UTF8
DETERMINISTIC
LANGUAGE SQL
SQL SECURITY INVOKER
BEGIN
DECLARE T_RET VARCHAR(1024) DEFAULT '';
DECLARE T_I, T_C, T_E BIGINT DEFAULT 0;
DECLARE F_NAME, F_OPIS VARCHAR(1024) DEFAULT '';
DECLARE T_CURS CURSOR FOR SELECT `id`,`id_sd` FROM `ac_ac`;
DECLARE EXIT HANDLER FOR NOT FOUND SET T_E:=1;
SET T_C:=(SELECT COUNT(`id`) FROM `ac_ac`);
OPEN T_CURS;
MW:LOOP
FETCH T_CURS INTO F_NAME, F_OPIS;
SET T_I:= T_I +1;
IF (SELECT COUNT(`id`) FROM `ac_ac` WHERE `id_sd`= F_OPIS)>=2 THEN
SET T_RET:= CONCAT_WS(',', T_RET, F_NAME);END IF;
IF T_I >= T_C || T_E =1 THEN LEAVE MW;END IF;END LOOP MW;
CLOSE T_CURS;
RETURN LEFT(RIGHT(T_RET)-1,1024);END//
DELIMITER ;
Хранимая функция выполняющая выборку повторяющихся два и более раз произвольное значение поля с именем `id_sd` и типом BIGINT UNSIGNED (большое целочисленное) и возвращает ее `id` перечисленные через запятую, таблицы с именем ac_ac которая в свою очередь имеет следующую структуру:
CREATE TABLE IF NOT EXISTS `ac_ac`(`id` SERIAL,`id_sd` BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
KEY (`id_sd`)) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
Задача проста, подставьте нужные имена ячеек, и имя таблицы в функции на свои.
Залейте ее через phpMyAdmin, используйте как, встроенную функцию SQL в предложении SELECT исполняемого запроса в связке к примеру с IN.
Пожалуйста, пользуйтесь на здоровье)
Написал: Erika
26.05.2013 / 14:52
10. Trionix, жесть, а я вице президент Майкрософт, что называется сразу после Билли. Гг)
Может мне за Вас еще и код настропать? Если Вы читаете текст книги выборочно, мне Вас искренне жаль. В ней то и поиск по словосочетанию воспрещен, специально от подобных неуков. Могу еще с десяток книг подкинуть, если хотите. И все они прочтены от корки до корки, уверяю Вас.
----
Коли Вы считаете себя столь умным, к чему тогда весь этот цирк с оптимизацией горбатого кода, что за танцы с бубном? Дело Ваше, катайтесь на велике без колес.
Написал: Erika
26.05.2013 / 09:39
8. Trionix, возьмите любую книгу по администрированию СУРБД. И прочтите то что на первый взгляд Вам покажется самым не интересным.
По поводу статьи по ссылке. Взглянув на примеры кодов - читать не стала.
PS.
И еще одно, позвольте узнать, почему это личное мнение какого то мистера Зайцева я должна ставить выше вот этой кгиги ?
Написал: Erika
26.05.2013 / 08:38
6. Trionix, видимо Вы не дружите с книгами, не в курсе, что на каждый запрос выделяется определенный лимит времени и памяти. А запросы со звездочками автоматически регистрируются системой в журнале ламмерских запросов сервера БД. Это, как звонок пожарной сигнализации на который, опытный и аккуратный программист не может не обратить пристального внимания во избежание катастроф связанных с возможными нагрузками (например ддос), в виду своего личного профессионилизма.
Давайте. Создайте еще один на обе ноги кривой дцмс (ранних версий). Вас же будут тыкать носом, с Вас же будут скромно улыбатся в усы, тихонько перешептываясь знающие люди, профессионалы. По этому мне, как соловью - извращайтесь.
PS.
Но если же Вы вдруг произошли из славного рода Страшилы Мудрого, пардон - ищите Элли. На совместных теннингах со всей ее гоп компанией, стопуя незадачливых туристов по пути к Гудвину Вы волей - не волей научитесь немного и изредка, чуток пошевеливать своими соломенными извилинами)
Добавлено через 06:36 сек.
5. Zдешний, о чем Вы?
Человек спросил совет по оптимизации горбатого кода - я его дала. Возможно в этой отрасли институтов я не заканчивала, но книг на своем веку прочла не мало. По этому его по праву можно назвать авторитетным.
Возможно Вас интересуют какие нибуть конкретные моменты. Тогда будьте добры - уточните.
Написал: Erika
26.05.2013 / 08:15
В место звездочек в COUNT(*) поставьте значение какого нибуть одного поля например, примака. После измерьте скорость выполнения запроса, прирост очевиден. Используйте в запросах LIMIT. Если не надо много одинаковых значений - сгруппируйте их. Еще лучше пометьте UNIQUE непосредственно в теле таблицы. Выводите в SELECT не звездочкой, а только имена нужных Вам полей перечисленных через запятую, Используйте хранимый код он быстрее выполняется. SQL на самом деле на много фукциональнее и богаче чем Вы можете себе это вообразить, молодой человек. Посему, советую изучить его глубже, воспользуйтесь специализированной литературой для этого.
Удачи в разработке. Всех Вам благ
Написал: Erika
26.05.2013 / 00:52
Сейчас, только достану свой хрустальный шар...
Конечно лестно когда тебе присваивают сверх естественные способности. Но все же, вы явно переоцениваете всех нас, молодой человек.
Для начала опишите структуру таблицы
Добавлено через 03:34 сек.
Iznaur95 (1 Мая 2013 / 22:30)
хотя бы подскажите почему ORDER BY `id` ASC/DESC никак не влияет на этот запрос
SELECT * FROM table GROUP BY user_id HAVING count(*) > 1
Что за горбатый велик без колес?
Написал: Erika
25.05.2013 / 07:54
Доброго времени суток, уважаемые форумчане.
Триггер не хочет оптимизировать таблицу.
DELIMITER //
DROP TRIGGER IF EXISTS ac_blog_dir //
CREATE DEFINER = CURRENT_USER TRIGGER ac_blog_dir BEFORE INSERT ON ac_blog_dir
FOR EACH ROW
BEGIN
OPTIMIZE TABLE ac_blog_dir;END//
DELIMITER ;
Думала может у меня еще OPTIMIZE TABLE для InnoDB не работает, заменила на
ALTER TABLE ac_blog_dir ENGINE InnoDB
Но и от этого #1422 - Explicit or implicit commit is not allowed in stored function or trigger
(Явная или не явная фиксация не позволена в сохраненной функции или триггере)
Может кто знает, как обойти эту бугагу? Подскажите, а...
Написал: Erika
24.05.2013 / 16:14