21 Востаннє редагувалося ConTrast77 (28.03.2015 02:32:57)

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Invader,

Тобто у вас таблиця повинна сортуватись по ?:
Студенти + поля даних про студентів), ID, ID_Curator, Index_kurs
а потім куратори, з попередньо отриманого списку, а знайти саме по попередньому ID_curator?

Куратор ( + поля даних як про студентів), ID, ID_Curator (=ID/null), Index_kurs

і ще запитання: що означає індекс 6 або null ? Це не ID, а що.
Як ви в вашої таблиці відзначаєте кураторів? у глобальному сенсі? тільки з пошуку  ID_Curator , чи є якийсь окремий стовпчик, що ця людина Є куратор (ENUM 'Curator')... чи може я вірно здогадався що index_kurs, може мати число від 1 до 6, або nill якщо - куратор?

- тобто не ясно з індексом (не ID...x) та як ви відзначаєте ідентичність куратора

22 Востаннє редагувалося ConTrast77 (28.03.2015 03:17:27)

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Vo_Vik написав:
SELECT MAX(id) FROM myTable

це є вектор. ви віднімаєте і додаєте 100 до вектора, це може і буде працювати, але нафіга?

- а ви порахуйте, замість критики... ну добре це питання, але не стосується теми. Тобто все одно критика.
- в моєму прикладі це вибірка значень та маніпулювання ними, щоб можливі значення були в межах замість "від 0 до MAX(id)" а "від 100 до MAX(id)". Це елементарно, але комусь важко підставити пару примірників, провести "дебаг" на рівні людського ресурсу.


Vo_Vik написав:
 FROM
(SELECT @num:=0) AS a,
myTable LIMIT 6

- як би мало працювати оце. я взагалі не уявляю, навіть не можу уявити логіки, що ви хотіли би щоб воно робило. Це що, щоб нумерувати вибрані рядки?

Так, @num:=0 - початкова ініціалізація змінної, доречі вона добре показала себе відносно тематики про область видимості змінної у SELECT після FROM ініціалізації.

якщо в коді воно є і працює (в умовах не обов'язково), і якщо ви знаєте що воно виконує, то не треба з цого робити проблему. Воно дійсно працює і весь англомовний світ з багаторазового посилання на цю сторінку з цим прикладом http://www.warpconduit.net/2011/03/23/s … k-results/ жодного разу не питав "навіщо і зайво ви це туди вклеїли". Я взяв стандартний приклад і він не має обов'язковості до завдання. Ви мали би просто оминути своєю увагою при читанні коду.


- бажано дати саме завдання перед тим як пояснювати його важкість. Бо без формалізованого завдання, його реалізувати так нереально.

Завдання викладене - ви хочете саме мою реалізацію. З помилками. Так якщо я дам свої бідові коди, ви візьмете на сміх, замість проби розуміння "що мої коряві руки хочуть програмувати".
Але я не можу з вами співпрацювати, якщо ваша увага зовсім не там де треба.

Треба:

- о тут вже щось пробує вимальовуватись.
Тобто вам треба вибрати з таблиці n унікальних випадкових записів? Десь такої умови я від вас хотів.


Vo_Vik написав:

Вам ніколи не казали що ви тяжкий у спілкуванні?

В залежності від бажання розуміння з зворотньої сторони замість принижень (нападів)

Vo_Vik написав:

Навіщо ви перейшли до зминних і тимчасових таблиць, коли прості селекти ще не освоїли. І ще ви розумієте різницю між таблицею, рядком таблиці, полем(колонкою, стовбчиком) таблиці і значенням конкретного поля конкретного рядка таблиці?

Це не стосується теми і предмету запиту, до того ж передчасне зауваження.
Тому у відповідь - даю заяву "Поскаржитися модератору".

Оскільки:

Прихований текст

1) ви питаєте код який вам не потрібен, бо в зауваженнях на цьому етапі - тільки прискипливість замість вирішення завдання поза контексту конкретних дій.
2) не бажання розуміння причини .. викладеної робочої логіки коду або умовно бажаної роботи коду. Тобто виховування мене таке, що митцем не маю стати, а повинен тільки дрова рубати, бо комусь мої здібності вважаються бездарними.

Можливо ви бачите мене скупим і не тямучим, що підгрібає код в свої хованки, мабуть аватарка допомагає..
Я ж бачу вас нахабним зазнайкою. Допомоги ніякої, тільки зухвальства.

23

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Invader написав:

З таблиці потрібно вибрати імена, адреси електронної пошти, ідентифікатори, ідентифікатор куратора тих користувачів у яких поле індекс не дорівнює 6 або є NULL. Потім, на основі отриманих даних, вибрати імена кураторів і їхні ідентифікатори. Всі дані зберігається в одній таблиці. Будь-який із користувачів про якого є запис в таблиці може бути куратором для будь-якої к-ті інших користувачів і сам він теж може мати куратора, але тільки одного (якщо це взагалі має якесь значення в контексті даного обговорення). Один запит до однієї таблиці.

Такс, спочатку вас.

Щось приблизно отаке.

SELECT t1.*, t2.* 
FROM youTable t1
LEFT JOIN youTable t2 ON t1.Curator_id = t2.Id
WHERE t1.Id IS NULL OR t1.Id = 6
Подякували: Invader1

24

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Тепер, ConTrast77
Я до вас домахуюсь не просто для задоволення, а щоб полегшити життя на цьому форумі, тай взагалі в інтернетах. Правильно поставлене запитання - це 90% успіху у пошуках відповіді.

Отже шукаємо

mysql вибрати випадкові рядки з великої таблиці

mysql select random rows large table

Перший же лінк те що ви шукали надіюсь?
http://stackoverflow.com/questions/4329 … -rows-fast
і там же лінк на досить здорову статтю по темі
http://jan.kneschke.de/projects/mysql/order-by-rand/

зараз побавлюсь на своїй базі

25 Востаннє редагувалося Vo_Vik (28.03.2015 07:28:39)

Re: Один запит на вибріку з однієї таблиці двох наборів данних

"Дуже довгі тести"

Отже якщо

mysql> SELECT COUNT(*) FROM Property;
+----------+
| COUNT(*) |
+----------+
|  1562278 |
mysql> SELECT Id
    ->   FROM Property JOIN
    ->        (SELECT CEIL(RAND() *
    ->                     (SELECT MAX(Id)
    ->                        FROM Property)) AS Id
    ->         ) AS r2
    ->        USING (Id);
+--------+
| Id     |
+--------+
| 753264 |
+--------+
1 row in set (0.01 sec)
EXPLAIN SELECT Id   FROM Property JOIN        (SELECT CEIL(RAND() *                     (SELECT MAX(Id)                        FROM Property)) AS Id         ) AS r2        USING (Id);
+----+-------------+------------+--------+---------------+---------+---------+-------+------+------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows | Extra                        |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+------------------------------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL  |    1 |                              |
|  1 | PRIMARY     | Property   | const  | PRIMARY       | PRIMARY | 4       | const |    1 | Using index                  |
|  2 | DERIVED     | NULL       | NULL   | NULL          | NULL    | NULL    | NULL  | NULL | No tables used               |
|  3 | SUBQUERY    | NULL       | NULL   | NULL          | NULL    | NULL    | NULL  | NULL | Select tables optimized away |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+------------------------------+
4 rows in set (0.01 sec)

це тільки один і не абсолютний рандом. Тільки тестую)

mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS get_rands$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE get_rands(OUT output INT(11))
    -> BEGIN
    ->   DECLARE RandNumber INT(11);
    ->   SELECT CEIL(RAND()*COUNT(*)) INTO RandNumber FROM Property;
    ->   SELECT id INTO output FROM Property LIMIT 1 OFFSET RandNumber;
    -> 
    -> END$$
Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(@id);
Query OK, 1 row affected (0.84 sec)

mysql> SELECT @id;
+--------+
| @id    |
+--------+
| 571139 |
+--------+
1 row in set (0.00 sec)
mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS get_rands$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
    -> BEGIN
    ->   DECLARE total INT(11);
    ->   DECLARE randlimit INT(11);
    ->   SELECT COUNT(*) INTO total FROM Property;
    ->   IF total < cnt THEN
    ->     SET cnt = total;
    ->   END IF;
    -> loop_me: LOOP
    ->     IF cnt < 1 THEN
    ->       LEAVE loop_me;
    ->     END IF;
    ->     SELECT FLOOR(RAND() * total) INTO randlimit;
    ->     SELECT CONCAT(id, IF(list, CONCAT(", ", list), "")) FROM Property LIMIT 1 OFFSET randlimit INTO list;
    ->     SET cnt = cnt - 1;
    ->   END LOOP loop_me;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(6, @list);
Query OK, 1 row affected, 1 warning (3.28 sec)

mysql> SELECT @list;
+----------------------------------------------------+
| @list                                              |
+----------------------------------------------------+
| 1045153, 815087, 1876085, 2008350, 663196, 1162312 |
+----------------------------------------------------+
1 row in set (0.00 sec)

Але це не унікальні і довго вибирається

mysql> SELECT id FROM Property LIMIT 1 OFFSET 1121704;
+---------+
| id      |
+---------+
| 1271478 |
+---------+
1 row in set (0.48 sec)

Оце в принципі тормозить всю вибірку, але єдине що дає реальну рандомність, на нерівномірному розподілі ід.

26 Востаннє редагувалося Vo_Vik (28.03.2015 08:01:47)

Re: Один запит на вибріку з однієї таблиці двох наборів данних

ConTrast77, визнаю, був не правий, ваш останній селект, дійсно близький до оптимального.
три недоліки, якщо є пропуски в ід, то буде менше результатів, і як ви самі казали можуть бути дублі. Плюс, якщо пропуски нерівномірні, то рандом буде трохи перекособочений.
тому дещо переробив його до такого.

mysql> SELECT t.id
    ->     FROM
    ->     (SELECT
    ->     CEIL(RAND() * (SELECT MAX(id) FROM Property)) num,
    ->     @num:=@num+1
    ->     FROM
    ->     (SELECT @num:=0) AS a,
    ->     Property ) AS b,
    ->     Property AS t
    ->     WHERE b.num = t.id LIMIT 6;
+---------+
| id      |
+---------+
| 1053110 |
| 1751612 |
| 1520069 |
| 1049326 |
| 1983845 |
| 1346192 |
+---------+
6 rows in set (1.96 sec)

але при цьому дуже падає швидкість, і на малих таблицях нічого не повертає. Думаю ще)

27

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Оце працює одинаково правильно як на великих так і малих таблицях, але швидкість на великих падає

Прихований текст
mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS get_rands$$
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
    -> BEGIN
    ->   DECLARE total INT(11);
    ->   DECLARE randlimit INT(11);
    ->   SET list = "";
    ->   SELECT COUNT(*) INTO total FROM Property;
    ->   IF total < cnt THEN
    ->     SET cnt = total;
    ->   END IF;
    -> loop_me: LOOP
    ->     IF cnt <= LENGTH(list) - LENGTH(REPLACE(list, ',', '')) THEN
    ->       LEAVE loop_me;
    ->     END IF;
    ->     SELECT FLOOR(RAND() * total) INTO randlimit;
    ->     SELECT CONCAT(id, IF(list, CONCAT(", ", list), "")) FROM Property LIMIT 1 OFFSET randlimit INTO list;
    ->   END LOOP loop_me;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(6, @list);
Query OK, 1 row affected, 1 warning (3.19 sec)

mysql> SELECT @list;
+-------------------------------------------------------------+
| @list                                                       |
+-------------------------------------------------------------+
| 1750711, 1041962, 1860984, 799658, 1567391, 1281753, 599834 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS get_rands$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
    -> BEGIN
    ->   DECLARE total INT(11);
    ->   DECLARE randlimit INT(11);
    ->   SET list = "";
    ->   SELECT COUNT(*) INTO total FROM test_rand_property;
    ->   IF total < cnt THEN
    ->     SET cnt = total;
    ->   END IF;
    -> loop_me: LOOP
    ->     IF cnt <= LENGTH(list) - LENGTH(REPLACE(list, ',', '')) THEN
    ->       LEAVE loop_me;
    ->     END IF;
    ->     SELECT FLOOR(RAND() * total) INTO randlimit;
    ->     SELECT CONCAT(id, IF(list, CONCAT(", ", list), "")) FROM test_rand_property LIMIT 1 OFFSET randlimit INTO list;
    ->   END LOOP loop_me;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(6, @list);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> SELECT @list;
+------------------------------------------------------+
| @list                                                |
+------------------------------------------------------+
| 483491, 483473, 92248, 483472, 483488, 92248, 483493 |
+------------------------------------------------------+
1 row in set (0.00 sec)

28

Re: Один запит на вибріку з однієї таблиці двох наборів данних

А нє, бачу повтори(

29

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Ось є що все робить правильно, але повільно

Прихований текст
mysql> CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
    -> BEGIN
    ->   DECLARE total INT(11);
    ->   DECLARE maxid INT(11);
    ->   SET list = "";
    ->   SELECT COUNT(*) INTO total FROM Property;
    ->   SELECT MAX(id) INTO maxid FROM Property;
    ->   IF total < cnt THEN
    ->     SET cnt = total;
    ->   END IF;
    -> loop_me: LOOP
    ->     IF cnt <= (LENGTH(list) - LENGTH(REPLACE(list, ',', '')))+1 THEN
    ->       LEAVE loop_me;
    ->     END IF;
    ->     SELECT IF(id,CONCAT(id, IF(list, CONCAT(", ", list), "")), "")
    ->     FROM Property WHERE id = CEIL(RAND() * maxid) AND id NOT IN (list) LIMIT 1 INTO list;
    ->   END LOOP loop_me;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(6, @list);
Query OK, 1 row affected, 2 warnings (18.68 sec)

mysql> SELECT @list;
+-------------------------------------------------+
| @list                                           |
+-------------------------------------------------+
| 858588, 803902, 695461, 705043, 1007166, 593160 |
+-------------------------------------------------+
1 row in set (0.00 sec)

30

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Оце оптимальне, що можу добитись

Прихований текст

Процедура

DELIMITER $$
DROP PROCEDURE IF EXISTS get_rands$$
CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
BEGIN
  DECLARE total INT(11);
  DECLARE maxid INT(11);
  DECLARE climit INT(11);

  SELECT COUNT(*) INTO total FROM Property;
  IF total < cnt THEN
    SET cnt = total;
  END IF;

  SELECT MAX(id) INTO maxid FROM Property;

  SET list = "";
  loop_me: LOOP
    IF LENGTH(list) > 0 THEN
      SET climit = cnt - (LENGTH(list) - LENGTH(REPLACE(list, ',', ''))) - 1 ;
    ELSE
      SET climit = cnt;
    END IF;
    IF climit <= 0 THEN
      LEAVE loop_me;
    END IF;
    SELECT IF(id,CONCAT(id, IF(list, CONCAT(", ", list), "")), "")
    FROM 
    (
      SELECT
        CEIL(RAND() * (SELECT MAX(id) FROM Property)) num
      FROM Property LIMIT 1
    ) AS b,
    Property AS t
    WHERE b.num = t.id AND t.id NOT IN (list) INTO list;
  END LOOP loop_me;
 
END$$
DELIMITER ;
CALL get_rands(6, @list);
SELECT @list;

тести

mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS get_rands$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
    -> BEGIN
    ->   DECLARE total INT(11);
    ->   DECLARE maxid INT(11);
    ->   DECLARE climit INT(11);
    -> 
    ->   SELECT COUNT(*) INTO total FROM Property;
    ->   IF total < cnt THEN
    ->     SET cnt = total;
    ->   END IF;
    -> 
    ->   SELECT MAX(id) INTO maxid FROM Property;
    -> 
    ->   SET list = "";
    ->   loop_me: LOOP
    ->     IF LENGTH(list) > 0 THEN
    ->       SET climit = cnt - (LENGTH(list) - LENGTH(REPLACE(list, ',', ''))) - 1 ;
    ->     ELSE
    ->       SET climit = cnt;
    ->     END IF;
    ->     IF climit <= 0 THEN
    ->       LEAVE loop_me;
    ->     END IF;
    ->     SELECT IF(id,CONCAT(id, IF(list, CONCAT(", ", list), "")), "")
    ->     FROM 
    ->     (
    ->       SELECT
    ->         CEIL(RAND() * (SELECT MAX(id) FROM Property)) num
    ->       FROM Property LIMIT 1
    ->     ) AS b,
    ->     Property AS t
    ->     WHERE b.num = t.id AND t.id NOT IN (list) INTO list;
    ->   END LOOP loop_me;
    ->  
    -> END$$
Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(6, @list);
Query OK, 1 row affected, 2 warnings (0.67 sec)

mysql> SELECT @list;
+--------------------------------------------------+
| @list                                            |
+--------------------------------------------------+
| 999086, 814734, 1704639, 1209932, 768563, 877627 |
+--------------------------------------------------+
1 row in set (0.00 sec)

mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS get_rands$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE get_rands(IN cnt INT, OUT list VARCHAR(256))
    -> BEGIN
    ->   DECLARE total INT(11);
    ->   DECLARE maxid INT(11);
    ->   DECLARE climit INT(11);
    -> 
    ->   SELECT COUNT(*) INTO total FROM test_rand_property;
    ->   IF total < cnt THEN
    ->     SET cnt = total;
    ->   END IF;
    -> 
    ->   SELECT MAX(id) INTO maxid FROM test_rand_property;
    -> 
    ->   SET list = "";
    ->   loop_me: LOOP
    ->     IF LENGTH(list) > 0 THEN
    ->       SET climit = cnt - (LENGTH(list) - LENGTH(REPLACE(list, ',', ''))) - 1 ;
    ->     ELSE
    ->       SET climit = cnt;
    ->     END IF;
    ->     IF climit <= 0 THEN
    ->       LEAVE loop_me;
    ->     END IF;
    ->     SELECT IF(id,CONCAT(id, IF(list, CONCAT(", ", list), "")), "")
    ->     FROM 
    ->     (
    ->       SELECT
    ->         CEIL(RAND() * (SELECT MAX(id) FROM test_rand_property)) num
    ->       FROM test_rand_property LIMIT 1
    ->     ) AS b,
    ->     Property AS t
    ->     WHERE b.num = t.id AND t.id NOT IN (list) INTO list;
    ->   END LOOP loop_me;
    ->  
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL get_rands(6, @list);
Query OK, 1 row affected, 2 warnings (0.04 sec)

mysql> SELECT @list;
+-----------------------------------------------+
| @list                                         |
+-----------------------------------------------+
| 70174, 471301, 479197, 482362, 457230, 477117 |
+-----------------------------------------------+
1 row in set (0.00 sec)
Подякували: ConTrast771

31

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Репорт прочитав і вважаю що не всякий конфлікт має вирішуваи модератор, я також маю власні уподобання, але намагаюся обходитися без модерських повноважень.

Навіщо ви перейшли до зминних і тимчасових таблиць, коли прості селекти ще не освоїли.

Вважаю це не образою, а вказівкою напряму роботи, а вірна вона чи ні то вже не моє діло.

І ще ви розумієте різницю між таблицею, рядком таблиці, полем(колонкою, стовбчиком) таблиці і значенням конкретного поля конкретного рядка таблиці?

Співрозмовник питає вас чи володієте ви термінологією, необхідною (на його думку) для вирішення питання по БД.

32

Re: Один запит на вибріку з однієї таблиці двох наборів данних

ConTrast77 написав:
Прихований текст
Vo_Vik написав:

Навіщо ви перейшли до зминних і тимчасових таблиць, коли прості селекти ще не освоїли. І ще ви розумієте різницю між таблицею, рядком таблиці, полем(колонкою, стовбчиком) таблиці і значенням конкретного поля конкретного рядка таблиці?

Це не стосується теми і предмету запиту, до того ж передчасне зауваження.
Тому у відповідь - даю заяву "Поскаржитися модератору".

Оскільки:

Прихований текст

1) ви питаєте код який вам не потрібен, бо в зауваженнях на цьому етапі - тільки прискипливість замість вирішення завдання поза контексту конкретних дій.
2) не бажання розуміння причини .. викладеної робочої логіки коду або умовно бажаної роботи коду. Тобто виховування мене таке, що митцем не маю стати, а повинен тільки дрова рубати, бо комусь мої здібності вважаються бездарними.

Можливо ви бачите мене скупим і не тямучим, що підгрібає код в свої хованки, мабуть аватарка допомагає..
Я ж бачу вас нахабним зазнайкою. Допомоги ніякої, тільки зухвальства.

Скарги пишіть коли є явне порушення правил, а не коли ви хочете мамці комусь поплакатись

33

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Invader, то ваше питання вирішене?

Доречі, якби якось вдалось розділити тему. Бо якось дуже вже 2 різно рівневих питання тут вирішувалось.

34 Востаннє редагувалося Invader (28.03.2015 15:10:55)

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Так. Всім дякую.

35

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Доречі, тільки що дойшло, що в мому останньому рішенні по випадковій вибірці, можна замінити
(SELECT MAX(id) FROM Property) на maxid, яке власне для того і вибиралось.
І взагалі спростити

 (
SELECT
CEIL(RAND() * (SELECT MAX(id) FROM Property)) num
FROM Property LIMIT 1
) AS b,

на

 (
SELECT
CEIL(RAND() * maxid) num
) AS b,

Але не маю як потестити.

36 Востаннє редагувалося ConTrast77 (09.06.2015 10:38:31)

Re: Один запит на вибріку з однієї таблиці двох наборів данних

Vo_Vik написав:

Оце оптимальне, що можу добитись

Щиро дякую, і за відповідь, і за витрати вашого часу на ці забаганки (особливості питання).

Нічого не писав на форумі довгий час, тільки тримав закладинки бо питання було для мене остаточно не вирішеним.

Надаю свій варіант рішення, котрий я давно планував і намагався зробити саме без процедур:
- (просто так кортіло)
- цей код буде доданий до теми варіантів і ефективності вибірок рандом-даних, з відповідним описом
- вважав, що використання змінних SET @lalala, може мати деякий сенс в вирішенні у вибірках
- вибірка дійсно виконує умови, набирає рівно стільки рандомних (випадкових) значень, скільки потрібно, без повторів значень; тобто рівно "5" рядків, не більше і не менше.
- вибірка не може перевіряти рядки, номери яких не існують згідно отриманого переліку раному (це не потрібно)
- вибірка не може оминати рядки, якщо вони мають в особливій колонці особливе значення (але потрібно)

SET @count=0;
SET @in1=0; SET @in2=0; SET @in3=0; SET @in4=0; SET @in5=0;
SET @inX=0;
SELECT DISTINCT `blog`.`id`, `blog`.`zag_ua`, `blog`.`minitxt_ua`
FROM
    (SELECT
            blogR.id, @inX:=ROUND( RAND()* ((SELECT MAX(`id`) FROM `news2`)-100) )+100 num2, @in1,@in2,@in3,@in4,@in5
            FROM
                    # blogR.id - вибірка для розширеного розуміння, немає в ній необхідності
                    #   , як і в вибірках @in1,@in2,@in3,@in4,@in5  (вони тільки для налагодження)
                    `news2` as blogR
            where
                IF(
                    @inX NOT in (@in1,@in2,@in3,@in4,@in5),
                    
                    @count:= if(
                        (select concat (@in5:=@in4, @in4:=@in3, @in3:=@in2, @in2:=@in1, @in1:=@inX) ),
                        (select @count:=@count+1),
                        @count),
                    @count
                )<5 AND @in5=0
    ) AS numrandom,
    `news2` as blog
WHERE blog.id IN (numrandom.num2) AND @in5<>0
#  в останньому рядку коду AND @in5<>0 - я ще повинен перевірити до чого я так ставив
# умову, що рандомний рядок відповідатиме рядку з додатковою умовою AND news2.active_news ='A' не знаю куди поставити

Оскільки це остаточно виходить за рамки теми, то створюю нову тему, з цим кодом.
Питання буде вже в ракурсі оптимізації запиту до SQL, щодо цього вказаного коду.

Подякували: Анатолій1