Все в коді працює.
Може у кого є свіжий погляд, що явно можна оптимізувати, якщо я недогледів.

Стосовно locate() знайду час - сам перевірю, чи можна так складати запит: IF( LOCATE(' '+@inX+' ', @inTXT)=0, ...
саме у частині ' '+@inX+' ' і без використання concat(). Якщо виявиться, що так не можна, ото і буде питання.
Бо це не JavaScript і досі плутаюсь в інтерпритаторі SQL.


При деяких експериментах питання ще будуть.

Ще один з варіантів вибірки деякої кількості випадкових рядків.

КОД:
Спочатку генерується стовпчик з унікальними рандом-значеннями (integer) = numrandom.num2
Потім виконується вибірка з таблиці відповідних рядків, якщо news2.ID цих рядків (унікальне) і дорівнює кожному значенню з генерованої таблиці стовпчика numrandom.num2.

- цей код буде доданий до теми варіантів і ефективності вибірок рандом-даних, з відповідним описом
- вважав, що використання змінних 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' не знаю куди поставити

Питання:
1. як можна змінити примусові обчислення?
що буде швидше і оптимальніше аніж такий код:

@count:= if(
  # примусове обчислення 5-ти змінних, але за допомогою SELECT і додаткової функції, яка виконує додаткову непотрібну операцію
  (select concat (@in5:=@in4, @in4:=@in3, @in3:=@in2, @in2:=@in1, @in1:=@inX) ),
  # якщо умова IF виконується, а вона завжди виконується!, тоді збільшуємо значення @count на 1 теж за допомогою SELECT
  (select @count:=@count+1),
  # якщо IF не виконуєтся, а цього просто не може бути за даним кодом, тому просто для логіки повертаємо @count, хоча можемо поставити аби яке цифрове значення.... для швидкості
  @count)

2. чи потрібно змінювати вираз, і чи буде обчислення швидше?, (сам не перевіряв)
select concat (@in5:=@in4, @in4:=@in3, @in3:=@in2, @in2:=@in1, @in1:=@inX)
на іншу логіку, select concat (@inTXT, ', ', @inX, ' ')

і перевіряти тоді не виразом IF(@inX NOT in (@in1,@in2,@in3,@in4,@in5) ...
а виразом IF( LOCATE(' '+@inX+' ', @inTXT)=0 ... ... ,чи так можна? без (LOCATE(concat(..), ...)

3. DISTINCT таки є в коді, використовую бо в мене помилка в підготовці умов?
Не розумію, чому в вибірці SELECT `blog`.`id`, `blog`.`zag_ua`, `blog`.`minitxt_ua`
мені знадобився DISTINCT , не розумію чому генерується зайвий рядок або рядки, в умові IF(),
якщо виник збіг деякого нового отриманого значення @inX, з значенням із згенерованого набору @in1-@in4


Тепер код, який можна вважати зменшеним від першого з видаленням зайвого і зменшенням умов:

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

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
            @inX:=ROUND( RAND()* ((SELECT MAX(`id`) FROM `news2`)-100) )+100 num2
            FROM
                    `news2` as blogR
            where
                IF(
                    @inX NOT in (@in1,@in2,@in3,@in4,@in5),
                    
                    @count:= if(
                        (select concat (@in4:=@in3, @in3:=@in2, @in2:=@in1, @in1:=@inX) ),
                        (select @count:=@count+1),
                        @count),
                    @count
                )<5
    ) AS numrandom,
    `news2` as blog
WHERE blog.id IN (numrandom.num2)

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

4

(15 відповідей, залишених у Бази даних)

Анатолій написав:

2 Bartash класне відео я б декілька дякую поставив :)

ще не вистачає рішення синіх та прозорих "червоних" лінії :)

Так, я якраз вирішив всі ці завдання, з одночасними умовами на рахунок червоних, синіх ліній, одночасності їх перпендикулярності.

Але ніяк не зроблю маленьке шоу з цього приводу...
З котинятком була проблема але вирішена.

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) не бажання розуміння причини .. викладеної робочої логіки коду або умовно бажаної роботи коду. Тобто виховування мене таке, що митцем не маю стати, а повинен тільки дрова рубати, бо комусь мої здібності вважаються бездарними.

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

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) та як ви відзначаєте ідентичність куратора

Добре.
Ось код.

SELECT t.*
FROM
  (SELECT
    ROUND(RAND() * ((SELECT MAX(id) FROM myTable)-100))+100 num,
    @num:=@num+1
  FROM
    (SELECT @num:=0) AS a,
    myTable LIMIT 6) AS b,
    myTable AS t
  WHERE b.num = t.id AND t.xFactor='Q';

Важкість завдання:
Його важкість в тому, що код має вибірку декількох рандомних рядків, тобто умова змінюється кожного разу коли випадає нове число. З новим рандомним числом оновлюється перехід до реально-існуючого стовпчика. і так робить не одну вибірку а декілька разів! тому що умова змінюється в середині одного ЗАПИТУ кожного разу!
Тобто рандом! - не статична вибірка! Оо  *WALL*  , ... її просто так не вкладеш в аби яку частину коду.

Код працює дуже швидко навіть в великих таблицях.
Дійсно шукає випадкові комірки а не підряд "згідно шаблонів"
В таблиці кожен ряд має сортоване/не сортоване значення ID (індексоване, а тому і унікальне)
Значення ID може мати пропуски, а тому вибірка, не знайшовши рядок ID по умові-рандому, виконує новий пошук, доти вихідна таблиця не набере необхідну кількість вибраних рядків.

Проблеми завдання: - з якими я вже зіткнувся, треба вирішувати ...

- не використовувати самий простий запит типу SELECT * FROM myTable ORDER BY RAND() LIMIT 1; , а вдосконалити! наданий вище код (чи пропонувати інший, контрольований умовами коду, не втрачаючи імовірну швидкість пошуку).
- вищевказаний приклад, не перевіряє, якщо рандом випадково двічі обере, один і той самий рядок в вихідну таблицю.
- Чим менше кількість рядків в таблиці пошуку (донору) - тим більше вірогідність що 2 чи 3 рази нам буде показаний однаковий рядок. І тоді фільтрування типу GROUP BY, або SELECT DISTINCT у вищевказаному прикладі! - просто зменшить кількість рядків на виході опісля їх отримання. Ми не виконаємо тоді умову, що нам потрібна "X-кількість" рядків а не "X" мінус фільтр.

Треба:
- кожен рядок рандомно вирахуваний з таблиці
- кожен рядок не однаковий на виході, з аби яким іншим (імовірність однакових полів не повинна трапитись)
- рядків рівно стільки як треба, наприклад 6-ть (шість). І якщо шість у завданні, то не п'ять, не чотири на виході.
- реляційний запит
- таблиця-донор з 500.000 - 1.000.000 рядків. Тобто не можна просто так робити зайві пошукові операції.


Ось тому я поки що теоретично маю вихід:
Використання додаткової тимчасової таблиці CREATE TEMPORARY ...

- коли треба, додам рядок (з перевіркою або без, на однаковість, краще не робити тут перевірку)
- коли треба (якщо треба) порівняю нове отримане рандом-число з тимчасовою таблицею на співпадіння і одночасно перевірка з рядком таблиці-донора


P.S. Може у вас інший варіант чи натяк на методику?
P.P.S. цей текст потім продублюю в свою тему про рандом, затримуюсь ... там ще не виклав деякі результати інших рандом-рішень. Цей приклад буде кінцевим.

Гарний вираз:
- якраз про збереження глобальних змінних, та про область видимості змінних

Рос.:

Прихований текст
хранимые процедуры: DECLARE или SET

зачем вообще нужно DECLARED если можно использовать SET, а можно даже и SET не пользовать, а создавать переменные в контексте выполнения запросов.
и еще насчет области видимости переменных, в доках пишут что видимость ограничена блоком BEGIN END; но и за пределами хранимой процедуры я читаю переменные, которые инициализировались(там же и создавались) внутри процедуры.

http://sqlinfo.ru/forum/viewtopic.php?id=20


Відповідь про змінні користувача в рамках видимості.. запитів
MYSQL: ЗМІННІ В SQL ЗАПИТАХ
http://www.iinuu.ru/ru/it-guru/mysql-po … l-zaprosah


Мабуть команда CASE WHEN ... THEN ... (умова - відповідь)
- вже має закриту видимість умов в області WHEN  від виконання в області THEN
бо WHEN просить дужки відокремлення видимості

SELECT CASE WHEN nn<(@a_tmp:=2) AS dd THEN @a_tmp:=0 END FROM .. ... погано

Схоже знайшов рішення своєї проблеми і ТС.
CREATE TEMPORARY TABLES ...

- методом створення тимчасової таблиці, яка не є фізичною, вона автоматично знищується (не обов'язкове ручне керування знищенням таблиці) при закритті сесії користувача. Ця таблиця не є т.з. "віртуальна таблиця" TABLE VIEW.

Вимагає власний тип привілеї для користувача БД:
"Структура" = CREATE TEMPORARY TABLES


- таблиця зберігається у пам'яті і не зберігається в БД на вінчестері (оперативне зберігання)
- реляційність; кожен користувач може створити власну однойменну таку таблицю не заважаючи іншим користувачам (Примітка: таку таблицю можна використати як "костиль" у вигляді глобальної змінної поміж запитами і підзапитами/сабселектами або цілий набір даних. А призначення - тимчасова таблиця)
- якщо ця таблиця створена з однойменною назвою таблиці що вже існує, то вона, собою заслоняє реальну (постійну) таблицю, і робить невидимою, на час "свого існування".
- створення таблиці при копіюваннях даних з SELECT або LIKE стовпчики точно втрачають параметр PRIMARY KEY, але можливо їх створювати по заданих параметрах http://stackoverflow.com/questions/1439 … and-select


CREATE TEMPORARY TABLE tbl_name (...column definitions...);
- створення віртуальної тимчасової таблиці, по заданих параметрах (структури таблиці)

CREATE TEMPORARY TABLE new_table LIKE original_table;
- Повне дублювання заголовків/ структури з іншої таблиці

CREATE TEMPORARY TABLE tbl_name SELECT ... ;
- створення таблиці на умовах готової вибірки / результату набору SELECT ...
- повністю дублює дані в нову створену таблицю, згідно вибірки.
- створює пусту таблицю, по шаблону з SELECT
   (сам перевіряв на MySQL5, книга Пауля збрехала в 3-му виданні, але в 5-му точно так)

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


---
Ця команда - окрема. Логічно вважати, що для реляційності запиту до БД не має необхідності об'єднувати з іншими запитами користувача за сесію.

Приклад:

CREATE TEMPORARY TABLE new_tbl_name SELECT * FROM tbl_name LIMIT 5;
INSERT INTO new_tbl_name SELECT * FROM tbl_name LIMIT 3;
SELECT COUNT(*) FROM new_tbl_name;
...
DROP TEMPORARY TABLE tbl_name;

# не обов'язкове виконання DROP задля видалення тимчасової таблиці з структурою


інформацію взяв за основу тут, в розділі: Creating Temporary Tables (URL)

Vo_Vik написав:

Приклад працюючого сабселекту.

SELECT AVG( sum_column1 )
FROM (

SELECT SUM( column1 ) AS sum_column1
FROM t1
GROUP BY column1
) AS t1;

у мене помилка #1146 - Table 'bd_test.t1' doesn't exist
- сабселект не розуміє таблицю, сгенерованою головною (зовнішньою) відносно себе вибіркою

Як мені докучають відповіді не на задані питання, якщо у самому питанні вже було сказано, що потрібно.
А код наданий як непрацюючий, і вказано чому. Тобто Про сабселект вже було сказано.

Як ви вважаєте, про що я питав?

ConTrast77 написав:

невже немає підходу? при тому що один запит не розуміє дані з інших об'єднаних запитах....
або навіть питання таке: яку сторінку інтернету вивчити для виконання теоретично- задуманого?

наприклад:
- рекурсивність отриманих даних в сабселект чи навпаки
- глобальні змінні для селекту і сабселекту
- глобальні отримані вибірки (рекурсія отриманого поміж сабселектами)
- отримані дані з сабселекту знову вкинути в цей сабселект в частину умови WHERE

12

(7 відповідей, залишених у Бази даних)

SELECT char_number FROM ts ORDER BY LENGTH(char_number)ASC


Ще спробуйте

SELECT char_number FROM ts ORDER BY LENGTH(char_number) ASC, char_number ASC
SELECT char_number FROM ts ORDER BY LENGTH(char_number), char_number ASC

думаю lenght якраз спочатку поставить більш короткі однотипні назви (тобто наприклад все що ТП-10..ТП-99)

ТП-12
ТП-117
ТП-512
ТП-1212

відповідно цього
http://www.peachpit.com/articles/articl … p;seqNum=4
Tips/ Listing 4.15. - до ORDER BY можна вказувати умови (стовпчики), які не є в переліку стовпчиків до показу, але йдуть до фільтру згідно додаткових умов.


і ось така вигадка
- з використанням первинних значень як нумерований сортирований перелік з допомогою CASE when LIKE

SELECT char_number FROM ts ORDER BY
case 
    when name LIKE "ТП-%" then 1
    when name LIKE "ТПП-%"  then 2
    when name LIKE "БК-%"  then 3
    else 4
end,
LENGTH(char_number), char_number ASC

- щоб ця магія запрацювала - треба дещо зачарувати, очевидним жестом


Джерело примірників
http://www.sql.ru/forum/626794/opredeli … sya-simvol
http://stackoverflow.com/questions/2572 … ize-length - замість поля VARCHAR() поле TEXT
http://rgblog.ru/page/sekrety-sortirovki-v-mysql

P.S. Лайк- за магію, та будеш ще трохи винен.
"за магию нужно платить" (с) Румпельштицкен, (Once Upon a Time)
http://yoursmileys.ru/tsmile/money/t3907.gif

З вами згоден - і не було би такого питання.  [:}

Але "не пальцем тикано", питання полягає саме в реляційному підході  *DANCE* , бо БД і реляційність - найвища ланка цілісності БД  *YAHOO* . Тобто доки є один цілісний запит - ніхто не може втручатись в вибірки або запис в БД. Це потрібно для цілісності, якщо буде використатись паралельне "сайт-адміністрування", і деякі запити користувачів будуть умовно одночасні до тих самих таблиць.

Це не питання базових знань, з виглядом на "Гавайські острови" очима програмних "костилів".

14

(38 відповідей, залишених у Розробка ігор)

Vo_Vik написав:

..... навіщо юзати yii, якщо вже більше півтора року існує yii2. Що ж ви такі технології використовуєте.

Ага з 2011 до 2014.10 він був у стані розробки
і дуже сирий!! станом 2013.10,
особливо для тих хто тільки починає вивчати аби яку MVC такого рівня

15

(38 відповідей, залишених у Розробка ігор)

Автори пишуть, що Yii2 - не зовсім те, що думають інші.
Тобто Yii2  це готовий фреймворк CMS з набором модулів і не має відношення до Yii (MVC only), як ніби нова версія.

або переплутав з їхнім іншим проектом, або дійсно так робили до 2014 року в розробці....
Виправте якщо не правий.

16

(12 відповідей, залишених у Робота)

Щодо мене, то в 2004 році створив свій перший власний сайт на базовому PHP+MySQL, вже труди вів до показу переліку товарів з перспективою заготовок на магазин (без CMS), та перелік головних сторінок і новин. Якісь власні фільтри форм на Java, без фреймворків на ті ж форми (того часу).

Треба було йти до одної фірми і не розмінюватись на вже існуючу роботу.

Так і недовчився програмуванню як хотілося б  *SCRATCH* ) ,  з усіякими патернами , ООП, CMS стикнувся тільки тепер! а це ж треба якось вміти читати код інших програмерів за ціма новими стандартами.... *CRAZY*

І на яку б студентську ЗП мене би взяли тепер? якщо знаю базиси, практику, але повільно роблю чи за стандартом БЕЙСІК программування)) Голова світла. JAVA, CANVAS, PHP, SQL до діла доводять, але ж на якому рівні? і швидкості. навіть не знаю з ким рівнятись.  :o

Стосовно Junior developer одного місяця вистачило у 2013 році (до Майдану), щоб навчитись додатковим вмінням (пару дрібничок тобто ООП PHP та власна приклад-програма на Canvas), і більше не оновлював запити.
Думаю, .. раз жодного діалогу, значить треба багато напрацьовувати знань/практики/швидкості (тобто більше інструментарію, щоб полегшував виконання задач).

17

(13 відповідей, залишених у Бази даних)

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

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

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

P.S. у вас на сайті мій запит, на гостьовій (запит прийшов на пре-модерацію). Якщо зацікавить - то товаришування за скайпом, я б мав за щирість.

18

(13 відповідей, залишених у Бази даних)

Наступний приклад показує елементи, послідовні - "підряд".
Обчислення випадковості, виконується тільки 1 раз для 1-го стовпчика,
інші вибірки рядків ідуть послідовним "перебиранням" до наступних рядків з таблиці донора,
якщо знач. >= від початкового.

>>> У такому випадку рядка вибірки йдуть "підряд" без особливого перескакування по таблиці донора
(коли значення ID донора упорядковано, переважно на збільшення, і значення цього стовпчика зберігаються не хаотично).

Швидкість вибірки  0.0115-0.0336 секунд, виконання перебирання швидкістю 0.0336 - у випадках - перехід до рядків на "далеку відстань"
(від попереднього місця попередньо знайденого значення по таблиці-донору).

SELECT  id, nn2, nn3
FROM table1 AS newstabl
      JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table1)) AS id) AS temp
WHERE newstabl.id >= temp.id  AND newstabl.nnn='A' LIMIT 6;

>> Відображає рядка 0 - 5 (6 усього, запит зайняв 0.0271 сек.)
>> Відображає рядка 0 - 5 (6 усього, запит зайняв 0.0293 сек.)
>> Відображає рядка 0 - 5 (6 усього, запит зайняв 0.0336 сек.)
>> Відображає рядка 0 - 5 (6 усього, запит зайняв 0.2862 сек.)
>> Відображає рядка 0 - 5 (6 усього, запит зайняв 0.0168 сек.)
>> Відображає рядка 0 - 5 (6 усього, запит зайняв 0.0115 сек.)

Приклад не особливий, він взятий як і попередні - ось тут:
http://www.warpconduit.net/2011/03/23/s … k-results/
в даному випадку: Inner Join Method

а у мене проблема така:
SELECT FROM (SELECT FROM ...) ...

Якщо у мене є вкладений запит, але його дані хочу використати потім у загальному зовнішньому запиті, то в мене помилка....
#1146 - Table 'TName1.name1' doesn't exist

SELECT * FROM table1, (SELECT FROM ... name1) as TName1 ...
while table1.NN = TName1.name1


або навіть такий десь запит:
#1146 - Table 'picture.num' doesn't exist

SELECT
      ROUND( RAND()* ((SELECT MAX(`id`) FROM `table1`)-100) )+100  num,
      @num:=@num+1  AS picture
   FROM 
         table1 ss
         left join
         picture
         on `table1`.`id` = picture.num 
   GROUP BY `table1`.`id`

невже немає підходу? при тому що один запит не розуміє дані з інших об'єднаних запитах....
або навіть питання таке: яку сторінку інтернету вивчити для виконання теоретично- задуманого?

20

(13 відповідей, залишених у Бази даних)

Тепер подивимось перший самий простий запит, рандомної вибірки:

SELECT nn, nn2 FROM table1 WHERE nnn='A' ORDER BY RAND() LIMIT 1

та переробимо його до моєї  потреби (вибірка 6-ти випадкових рядків) за цим принципом.

Запит нестерпно повільний, навіть потім перевірив у простій таблиці з 7-ми рядків.
Процес займав нескінченність. Пару разів переоновлював, перезавантажував запит.
Потім ще разок спробував - процес зайняв аж 58 секунд!!!
повторний запит - 42 секунд!!! навіть не знаю, куди він буферизував вибірку (перебірка таблиці), вінчестер інтенсивно пішов в навантаження роботою

SELECT nn, nn2 FROM table1 WHERE nnn='A' ORDER BY RAND() LIMIT 6

>> Отображает строки 0 - 5 (6 всего, запрос занял 57.6254 сек.)
>> Отображает строки 0 - 5 (6 всего, запрос занял 42.1137 сек.)

Потім зробилось іншого разу щось дивовижне, мабуть були скинуті зайві довгі запити (як ті, що кладуть сервер), швидкість ось така:

>> Отображает строки 0 - 5 (6 всего, запрос занял 26.1509 сек.)
>> Отображает строки 0 - 5 (6 всего, запрос занял 1.6966 сек.)
>> Отображает строки 0 - 5 (6 всего, запрос занял 1.6898 сек.)


Такий запит взагалі повільний на MySQL ( сервер 5.1.62, клієнт 5.0.8):
- хоч з ORDER BY , хоч без нього

SELECT id, nn2, nn3
FROM table1
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM table1 )
LIMIT 1

>> Отображает строки 0 - 0 (1 всего, запрос занял 72.4891 сек.)
>> Отображает строки 0 - 0 (1 всего, запрос занял 90.1927 сек.)