powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как избавиться от дублей в процедуре.
10 сообщений из 10, страница 1 из 1
Как избавиться от дублей в процедуре.
    #39637837
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста.
Есть процедура которая возвр. случайные id из таблицы.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DELIMITER $$
DROP PROCEDURE IF EXISTS get_rands$$
CREATE PROCEDURE get_rands(IN cnt INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS rands;
CREATE TEMPORARY TABLE rands ( rand_id INT );
  
loop_me: LOOP
IF cnt < 1
  THEN LEAVE loop_me;
END IF;
INSERT INTO rands
  SELECT r1.id
  FROM random AS r1
  JOIN (
    SELECT (RAND() * (SELECT MAX(id) FROM random)) AS id
  ) AS r2
  WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1;
  
SET cnt = cnt - 1;
END LOOP loop_me;
END$$
DELIMITER ;



Вот думал отловить с помощью отлова ошибки (1062 дублирование уник. ключа)

Повесть на поле rand_id уникальный ключ.
CREATE TEMPORARY TABLE rands ( rand_id INT UNIQUE);

Код: sql
1.
DECLARE CONTINUE HANDLER FOR 1062 SET cnt = cnt + 1;



И не хочет оно работать, подскажите как можно решить такое...
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637838
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11не хочет оно работатьЧто означает "не хочет"? Оно не может не работать.
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637841
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: sql
1.
2.
CALL get_rands(4);
SELECT * FROM rands;



Дубли в результате
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637842
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно пропустить итерацию при возникновении дубля?
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637852
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11Как можно пропустить итерацию при возникновении дубля?Просто пропустить? INSERT IGNORE.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
mysql> CREATE TEMPORARY TABLE rands ( rand_id INT UNIQUE);
Query OK, 0 rows affected (0.08 sec)

mysql> insert into rands select 1;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into rands select 2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into rands select 1;
ERROR 1062 (23000): Duplicate entry '1' for key 'rand_id'

mysql> insert ignore into rands select 2;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Records: 1  Duplicates: 1  Warnings: 1

mysql> select * from rands;
+---------+
| rand_id |
+---------+
|       1 |
|       2 |
+---------+
2 rows in set (0.03 sec)
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637873
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Но при возникновении дубля нужно увеличить переменную чтобы в итоге было 4 уникальных id
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637878
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11при возникновении дубля нужно увеличить переменную чтобы в итоге было 4 уникальных id
Ну так не майтесь фигнёй:

Код: sql
1.
2.
3.
4.
LOOP
INSERT IGNORE ...;
IF (SELECT COUNT(*) FROM rands) = cnt THEN LEAVE LOOP;
END LOOP;
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39637881
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и в начале проверяйте, что заданное cnt не больше количества записей в random - иначе будете генерить до морковкина заговенья...
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39638043
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо за помощь, понял.
...
Рейтинг: 0 / 0
Как избавиться от дублей в процедуре.
    #39638249
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё вопросы к профессионалам так сказать.

Данный выше метод судя по тестам, нормально отрабатывает при значительно кол-ве записей в бд и при отсутствии "дыр" в id'шниках.

А если применить другой подход.

1. Определяем общее кол-во записей
Код: sql
1.
select count(*) from rand_table



А уже потом выбирать из бд по limit со смещением rand() * (select count(*) from rand_table)
Либо на php брать заранее несколько случайных смещений и выдёргивать из бд
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как избавиться от дублей в процедуре.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]