21

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

Так, не багато. Вибачте, можливо задаю очевидні запитання.
проте виникло ще одне питання. В документації я не знайшов відповіді.
Наприклад, є таблиця А з переліком запитань. Таблиця Б з'єднана зовнішнім ключом з таблицею А.
Потрібно зробити так, щоб після видалення запису в таблиці Б, відповідний запис в таблиці А видалявся тільки тоді, коли він не використовується в інших записах таблиці Б?
Можливо, так?

ON DELETE CASCADE

Чи писати скрипт самому і через КРОН щовечора видаляти записи з таблиці А, які не використовуються в таблиці Б?

22

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

Якщо в таблиці буде зовнішній ключ, то при запиті до цієї таблиці в результаті буде інформація з двох таблиць (по ключу), так? Чи потрібно їх з'єднувати через JOIN?

23

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

Invader написав:

Чому б не скористатися зовнішніми ключами і не виділити запитання в окрему таблицю?

Можна було б)
Але чи збільшиться навантаження на сервер у такому випадку?

24

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

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

25

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

Привіт усім, хотів би з Вами проконсультуватися.
У мене є велика база тестів, багато з них повторюються, проте в різних темах. База займає великий розмір - близько 700 Мб.
Я придумав наступну методику. Виділити в базі всі тести а потім GROUP BY по полю "текст запитання"
Додати поле 'search' і в записах, що повторюються записати там ідентифікатор першого однакового запису, а сам текст запитання та варіанти відповіді видалити.
таким чином при пошуку запитань якщо поле 'search' != 0 - тоді шукати запитання з ідентифікатором, що вказане в 'search'.
Можливо Ви запропонуєте кращий варіант

26

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

ktretyak написав:
savelikan написав:

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

Так.

А одим запитом можна це все зробити?
Бо ынакше продуктивність буде низька

27

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

ktretyak написав:

Якщо вам потрібно бачити "Медицина -> Хірургія -> Оперативна хірургія", то створіть відповідно три таблиці. Перша таблиця "Медицина" найголовніша: видалення запису з неї видаляє всі записи з таблиць Хірургія та Оперативна хірургія.
Від другої таблиці Хірургія залежить лише таблиця Оперативна хірургія. Тобто видалення запису з Хірургія автоматично видаляє запис з Оперативна хірургія.


Для створення цих таблиць використовуйте ваш приклад, але в директиві REFERENCES посилайтесь на різні таблиці, а не на таблицю, яку створюєте...

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

28

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

ktretyak написав:

Ну от і пограйтесь із цим добром, раз вам воно подобається.

А який варіант пропонуєте Ви? де можна подивитися приклади його роботи?

29

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

ktretyak написав:

Розділіть по-людські, тобто замість однієї збірної таблиці створіть декілька. У тому вигляді, в якому ви її створили, таблиця pages не підходить для зберігання фрагментів однієї сторінки. Тут же явно вказано, що PRIMARY KEY (`pages_id`), тобто тут зберігаються різні сторінки, але видаляються в залежності від поля pages_address...

Ну і добре, коли видаляєш запис, всі "дочірні" видаляються автоматично. І про цей метод пишуть в літературі як "Метод Смежных вершин (Ajacency List)"

30

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

ktretyak написав:
savelikan написав:

А ще питання по тому прикладу, який я навів. Щоб побудувати повний адрес, необхідно зробити запит в циклі, поки address не буде NULL
Чи є інші варіанти?

Про що мова?

    CREATE TABLE IF NOT EXISTS `pages` (
    `pages_id` int(11) NOT NULL AUTO_INCREMENT,
    `pages_address` int(11) NULL,
    `pages_type` int(11) NOT NULL,
    `pages_user` int(11) NOT NULL,
    `pages_date` int(11) NOT NULL,
    `pages_update` int(11) NOT NULL,
    `pages_title` varchar(200) NOT NULL,
    `pages_text` text NOT NULL,
    PRIMARY KEY (`pages_id`),
    CONSTRAINT `fk_address` FOREIGN KEY `fk_address` (`pages_address`)
    REFERENCES `pages` (`pages_id`)
    ON DELETE CASCADE
    ) ENGINE=InnoDB;

Ось так зберігається деревоподібна структура в БД
І я шукаю можливість одержати повну адресу запису. Наприклад,

INSERT INTO `pages` (`pages_id`, `pages_address`, `pages_type`, `pages_title`, `pages_text`) VALUES
(1, NULL, 0, 'Медицина', ''),
(2, 1, 0, 'Хірургія', ''),
(3, 2, 0, 'Оперативна хірургія', ''),
(4, 3, 0, 'Назва статті', '');

Як ожержати адресу запису "Назва статті" у вигляді:
Медицина -> Хірургія -> Оперативна хірургія

31

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

caballero написав:
savelikan написав:

Привіт усім!
Мені потрібно створити деревоподібну структуру таблиці в SQL.

Замість  дурниць  про  триггери  та  інші  речі  які  не  мають  відношення  до  деревоподібних  структур  куримо   Nested Sets  або  Materialized Path.   
  Якщо  мова  про промисловий  сервер  БД  а  не  Mysql  то  там  як  правило  є  спеціалізовані оператори  типу WITH   тому  там  можна  користуватися  і  примітивними структурами таблиць   я к   у вашому  прикладі.

Де можна детальніше про це прочитати?


А ще питання по тому прикладу, який я навів. Щоб побудувати повний адрес, необхідно зробити запит в циклі, поки address не буде NULL
Чи є інші варіанти?

32

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

Мені бажано хоча б знати як зробити ось це "this.style.background= \''.$background.'\';" на JQuery плавно

33

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

Прошу вибачення, що стільки питань, я тільки починаю освоювати JQuery
Ось так в мене будується один з варіантів відповідей у тесті:

$answers = explode("\r\n",$TSTquestions['krok_questions-answers']);
$answers = shuffle_assoc($answers);
FOREACH($answers AS $key => $value){
        IF($answers[$key][0]=="=")
        {
            $anstemp = substr($answers[$key],1);
            $background = '#32CD32';
        }else{
            $anstemp = $answers[$key];
            $background = '#FA8072';
        }
        $CONTENT .= '
        <LABEL CLASS="krok_answer">
            <DIV
                ID="'.$key.'"
                CLASS="new_answer" 
                OnClick="
                    if(document.getElementById(\'prew\').value != 0) {
                        document.getElementById(document.getElementById(\'prew\').value).style.background= \'#FFFFFF\'
                    }
                    this.style.background= \''.$background.'\';
                    document.getElementById(\'prew\').value = \''.$key.'\';
                "
                onmouseover="
                    if(document.getElementById(\'prew\').value != \''.$key.'\') {
                        this.style.background= \'#E6E6FA\';
                    }
                "
                onmouseout="
                    if(document.getElementById(\'prew\').value != \''.$key.'\') {
                        this.style.background= \'#FFFFFF\';
                    }
                "
            >
                <INPUT
                    STYLE="display:none;"
                    TYPE="radio"
                    NAME="answer'.$TSTquestions['krok_questions-id'].'"
                    VALUE="'.$key.'"
                >
                '.$anstemp.'
            </DIV>
        </LABEL>
        
        ';
}
$CONTENT .= '<INPUT TYPE="hidden" ID="prew" VALUE="0">';

В $answers містяться варіанти відповіді, кожен в окремому рядочку, вірна відповідь спочатку позначена символом "=".
Тут працює JavaScript. При натисканні на LABEL в prew записуться номер відповіді та вона виділяється. При виборі іншої відповіді, ми її виділяємо, а з prew береться інформація про те, з якої відповіді потрібно зняти виділення. Може це все зроблено не зовсім логічно і є можливість організувати це простіше на JQuery?
Просто я хотів би написати це саме на JQuery, щоб відповідь виділялася плавно.

Едіт: функція shuffle_assoc перемішує масив зі збереженням ключів. Зараз це не потрібна функція, можна перемішати просто випадково - це залишилося ще з минулої версії коду)

34

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

Дякую, я спробую)

А тут в чому може бути помилка?
$(this).animate({background-color:'#ffdddd'},1000);

35

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

Так, все правильно. От тільки  current_q_num береться з div, який відображається користувачам як номер поточного запитання. Тобто 0 - на одиницю менше від того, що мало б відображатися. Чи можливо треба використати два лічильника?

36

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

muhasjo написав:

Але для чого так робити?

Та все ті тести роблю)
Тут одне питання виводиться на сторінку, а при натисканні "наступне запитання" черел скріпти підвантажується наступне запитання. В запитанні також є JS які змінюють фон відповіді залежно від того, правильна вона чи ні.
І ось, що в мене вийшло:

function getquestion(next) {
    $("#test_div_id").fadeOut(500, function(response){
        var current_q = $("#corrent_q_num").html();
        $.ajax({
            url: "ajax.php?subj_id='.ceil($_GET['id']).'&action=" + next + "&current=" + current_q
        }).done(function(response){
            var obj = JSON.parse(response);
            if( obj.status == 1 ){
                $("#test_div_id").html(obj.text);
                $("#corrent_q_num").text(obj.current);
            } else {
                $("#test_div_id").text(obj.text);
            }
        });
        $("#test_div_id").fadeIn(500);
    });
}

current_q = поточний номер запитання, береться з форми DIV, спочатку рівне 0
Ну а PHP визначає з якого запису шукати

IF($_GET['action']==1){
    $limit = ceil($_GET['current'])+1;
}elseIF($_GET['action']==2){
    $limit = ceil($_GET['current'])-1;
}

$limit - це запис, з якого почати пошук результатів: LIMIT ".$limit.", 1
Але тут є одна проблемка. Відрахування запитань та відображення результатів починається з 0
Всі спроби почати від 1 закінчуються тим, що пропускається перший результат пошуку, бо тоді зразу $limit=2
=(

Крім того, в мене ось це $(this).animate({background-color:'#ffdddd'},1000); не працює, хоча $(this).animate({height:'+=200px'},1000); працює

37

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

А це допомогло)))

function getquestion(next,current) {
    $("#test_div_id").hide(500);
    $.ajax({
        url: "ajax.php?subj_id='.ceil($_GET['id']).'&action=" + next + "&current=" + current
    }).done(function(response){
        var obj = JSON.parse(response);
        var corrent_q = $("#corrent_q_num").html();
        if( obj.status == 1 ){
            $("#test_div_id").text(obj.text);
            corrent_q++;
            $("#corrent_q_num").text(corrent_q);
        } else {
            $("#test_div_id").text(obj.text);
        }
    });
}

А чи можливо зробити так, щоб спочатку було $("#test_div_id").hide(500);, потім $("#test_div_id").text("завантаження..."); а після завантаження було $("#test_div_id").show(500);?

І ще.... Якщо Json передає частину HTML коду, як можна екранувати символи, щоб все було нормально? Чи в такому випадку JSON не підійде?

38

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

Привіт усім! Допоможіть, будь ласка, розібратися
Відправляю наступний запит:

function getquestion(next,current) { 
    jQuery.ajax({ 
        url:     "ajax.php?subj_id='.ceil($_GET['id']).'&action=" + next + "&current=" + current,
        type:     "POST",
        dataType: "html",
        data: jQuery("#"+"test_from").serialize(),  
        success: function(response) {
            document.getElementById("test_div_id").innerHTML = response; 
        }, 
        error: function(response) { //Если ошибка 
            document.getElementById("test_div_id").innerHTML = "Ошибка при отправке формы"; 
        } 
    }); 
}

одержую:

{"status":"1","text":"................."}

Як звідси одержати дані?

39

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

А чи можна дізнатися ІД всіх записів, які були видалені?

40

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

Я маю на увазі назва поля fk_address має бути унікальною для всіх таблиць в базі?