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, щодо цього вказаного коду.