[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Простой тест на PHP
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
maruo
Рандомно выводить получилось :D
Но что бы это сделать пришлось позвать на помощь rand , ибо когда было в запросе ORDER BY RAND() в первом запросе выводились ответы из вопроса под идентификатором 1. а во во втором запросе получался выводился другой вопрос.

Как еще можно выводить рандомно вопрос? без использования переменной $rand?


$query = "SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
RIGHT JOIN (SELECT q_id, q_quest
FROM question WHERE q_id=
$rand
) q USING(q_id) WHERE a.a_correct = 1 LIMIT 4
UNION
SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
RIGHT JOIN (SELECT q_id, q_quest
FROM question WHERE q_id=
$rand
) q USING(q_id) LIMIT 4
"
;
kostr
Неправильные ответы - там ведь должно быть
WHERE a.a_correct =0

почему вы это не задаете?
maruo
Цитата (kostr @ 24.12.2015 - 20:34)
Неправильные ответы - там ведь должно быть
WHERE a.a_correct =0

почему вы это не задаете?

$query = "SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
RIGHT JOIN (SELECT q_id, q_quest
FROM question WHERE q_id=
$rand) q USING(q_id) WHERE a.a_correct = 1
UNION
SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
RIGHT JOIN (SELECT q_id, q_quest
FROM question WHERE q_id=
$rand) q USING(q_id) WHERE a.a_correct = 0 LIMIT 4
"
;


Да поставил неправильные ответы.
Но у меня теперь новые проблемы.
Теперь правильный ответ всегда находится слева в каждом вопросе.
И ORDER BY RAND я не могу использовать.
Если ставлю его во втором запросе, то тогда не выводится верный иногда.
А в первом запросе нельзя ставить ORDER BY RAND выдает ошибку
kostr
а если так попробовать?

$query = "
SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN question q USING(q_id)
WHERE a.a_correct = 1 ORDER BY RAND() LIMIT 1
UNION
SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN question q USING(q_id)
WHERE a.a_correct = 0 ORDER BY RAND() LIMIT 4
"
;
maruo
WHERE a.a_correct = 1 ORDER BY RAND() LIMIT 1

Перед юнион нельзя использовать ORDER BY сразу выдает ошибку
Incorrect usage of UNION and ORDER BY

Если убрать то все работает , но тогда правильный не всегда выводится Рандомно

+ к тому использование Inner join( пока не уверен что именно это оно так влияет)
Выводит ответы на другие вопросы(рандомно)
kostr
А так тогда:
$query = "
SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN (SELECT q_id, q_quest FROM question ORDER BY RAND() LIMIT 1) q USING(q_id) WHERE a.a_correct=1
UNION
SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN (SELECT q_id, q_quest FROM question ORDER BY RAND() LIMIT 4) q USING(q_id) WHERE a.a_correct=0
"
;

maruo
INNER JOIN (SELECT q_id, q_quest FROM question ORDER BY RAND() LIMIT 4)

Здесь нельзя ставить лимит 4 выводится 4 вопроса же
И использовать ORDER BY RAND в выборке q_id , q_quest тоже нельзя.
До юнион может вывести ответы на вопрос первый.
А после юнион запрос может вывести ответы на 2й вопрос к примеру
kostr
Вы не могли бы написать структуру таблиц? А то я проверить не могу и все сюда пишу вслепую.
maruo
Цитата (kostr @ 24.12.2015 - 21:30)
Вы не могли бы написать структуру таблиц? А то я проверить не могу и все сюда пишу вслепую.

sql
Свернутый текст
--
-- Структура таблицы `question`
--

CREATE TABLE IF NOT EXISTS `question` (
`q_id` int(11) NOT NULL AUTO_INCREMENT,
`q_quest` varchar(255) NOT NULL,
PRIMARY KEY (`q_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Дамп данных таблицы `question`
--

INSERT INTO `question` (`q_id`, `q_quest`) VALUES
(1, 'сколько будет 2 + 2'),
(2, 'сколько будет 2 + 3');

--
-- Структура таблицы `answer`
--

CREATE TABLE IF NOT EXISTS `answer` (
`a_id` int(12) NOT NULL AUTO_INCREMENT,
`q_id` int(11) NOT NULL,
`a_answer` varchar(255) NOT NULL,
`a_correct` int(1) NOT NULL,
PRIMARY KEY (`a_id`),
KEY `q_id` (`q_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

--
-- Дамп данных таблицы `answer`
--

INSERT INTO `answer` (`a_id`, `q_id`, `a_answer`, `a_correct`) VALUES
(1, 1, '2', 0),
(2, 1, '4', 1),
(3, 1, '6', 0),
(4, 1, '8', 0),
(5, 2, '1', 0),
(6, 2, '3', 0),
(7, 2, '5', 1),
(8, 2, '7', 0),
(9, 2, '9', 0);

Примерно такая же у меня , только данные разные

user posted imageuser posted image
Valick
maruo, не усложняйте себе жизнь. Здесь нет острой необходимости разбивать себе лоб, т.е. выполнить всё одним запросом.
1 запрос рандомный выбор вопроса.
2 запрос выбор правильного варианта UNION выбор 4-х неправильных вариантов рандомно для вопроса из первого запроса.


_____________
Стимулятор ~yoomoney - 41001303250491
maruo
Цитата (Valick @ 24.12.2015 - 21:45)
maruo, не усложняйте себе жизнь. Здесь нет острой необходимости разбивать себе лоб, т.е. выполнить всё одним запросом.
1 запрос рандомный выбор вопроса.
2 запрос выбор правильного варианта UNION выбор 4-х неправильных вариантов рандомно для вопроса из первого запроса.

Но ведь можно? сделать так? Суть уже не в том усложнять или нет.
Теперь хочу сделать именно так. Вдруг пригодится.

К тому же есть непонимания, почему нельзя использовать ORDER by перед юнион.
я такого ни в каком источнике не нашел пояснений
kostr
В общем пока вижу только один путь: сначала рандомно выбрать номер вопроса $q_id, а потом по нему запрашивать ответы.

$query = "
(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN (SELECT q_id, q_quest FROM question WHERE q_id=$q_id ORDER BY RAND()) q USING(q_id) WHERE a.a_correct=1 LIMIT 1)
UNION
(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN (SELECT q_id, q_quest FROM question WHERE q_id=$q_id ORDER BY RAND()) q USING(q_id) WHERE a.a_correct=0 LIMIT 4)
"
;
Valick
Цитата (kostr @ 24.12.2015 - 20:54)
сначала рандомно выбрать номер вопроса $q_id, а потом по нему запрашивать ответы

у вас два разных* рандомных вопроса smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
maruo
Цитата (kostr @ 24.12.2015 - 21:54)
В общем пока вижу только один путь: сначала рандомно выбрать номер вопроса $q_id, а потом по нему запрашивать ответы.

$query = "
(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN (SELECT q_id, q_quest FROM question WHERE q_id=$q_id ORDER BY RAND()) q USING(q_id) WHERE a.a_correct=1 LIMIT 1)
UNION
(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
FROM answer a
INNER JOIN (SELECT q_id, q_quest FROM question WHERE q_id=$q_id ORDER BY RAND()) q USING(q_id) WHERE a.a_correct=0 LIMIT 4)
"
;

Не получится, переменная не определена, даже если определяешь то другие последствия.
maruo
Цитата (Valick @ 24.12.2015 - 22:01)
Цитата (kostr @ 24.12.2015 - 20:54)
сначала рандомно выбрать номер вопроса $q_id, а потом по нему запрашивать ответы

у вас два разных* рандомных вопроса smile.gif

Это исправить просто, убрать во втором запросе Rand
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.