Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
1
MySQL

UNION and ORDER BY RANDOM()

24.12.2015, 21:10. Показов 1037. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$end_line = "\n";
$rand = rand(1,5);
$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() выдает ошибку Incorrect usage of UNION and ORDER BY

PHP
1
FROM question  WHERE q_id=$rand)  q USING(q_id) WHERE a.a_correct = 0 ORDER BY RANDOM() LIMIT 4
После юнион если я использую ORDER BY RANDOM() то у меня тогда не выводится верный ответ ( не всегда, рандомно)

Если не использовать ORDER BY RANDOM то правильный ответ всегда находится слева.
UNION and ORDER BY RANDOM()


Как мне сделать так что бы выводились 4 варианта ответа. И всегда присутствовал верный. Даже если в таблице неограниченное кол-во ответов 100500+
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2015, 21:10
Ответы с готовыми решениями:

ORDER BY в UNION
Имеем таблицу CREATE DATABASE Solution; CREATE TABLE Solution.table_costs ( id...

Union и order by
есть вот такой запрос: with DataModule1.ZQuery1 do begin Close; sql.Clear; ...

Конфликт union и order by
есть такое задание(картинка во вложение), после задания идет правильный вывод решения. вроде все...

HSQL запрос. Что не так? "from hiberdata.Order order where order.clientId=?"
public List loadOrdersByClientId(Integer clientId) { return getHibernateTemplate().find( 'from...

6
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
24.12.2015, 21:29  [ТС] 2
Да и что бы неверные ответы выводились каждый раз разные
0
576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603
24.12.2015, 22:11 3
Цитата Сообщение от maruo Посмотреть сообщение
Как мне сделать так что бы выводились 4 варианта ответа. И всегда присутствовал верный. Даже если в таблице неограниченное кол-во ответов 100500+
у вас же помечен верный ответ?
покажите структуру таблиц, может можно по другому написать запрос
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
24.12.2015, 22:28  [ТС] 4
SQL
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
--
-- Структура таблицы `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);
0
576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603
24.12.2015, 23:21 5
maruo, ну если надо выводить один вопрос с тремя не верны и одним верным то можно так
PHP
1
2
3
4
5
6
7
8
$rand = rand(1,2);  // тут 1,2 так как в БД было только 2 записи
$sql = mysqli_query ($db, "SELECT a.*, q.* FROM `question` q 
INNER JOIN `answer` a ON q.q_id = a.q_id
WHERE q.q_id='".$rand."' AND a.a_correct = 1 OR a.a_correct = 0
LIMIT 4");
while ($row = mysqli_fetch_assoc($sql)) {
    echo $row['q_quest']." ".$row['a_answer']."<br>";
}
Добавлено через 6 минут
скобки забыл
PHP
1
2
3
4
5
6
7
8
9
$rand = rand(1,2);  // тут 1,2 так как в БД было только 2 записи
$sql = mysqli_query ($db, "SELECT a.*, q.* FROM `question` q 
INNER JOIN `answer` a ON q.q_id = a.q_id
WHERE q.q_id='".$rand."' 
AND (a.a_correct = 1 OR a.a_correct = 0)  ORDER BY RAND()
LIMIT 4");
while ($row = mysqli_fetch_assoc($sql)) {
    echo $row['q_quest']." ".$row['a_answer']."<br>";
}
Добавлено через 5 минут
Должно работать
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
24.12.2015, 23:24  [ТС] 6
Цитата Сообщение от Виталюска Посмотреть сообщение
Должно работат
Работать то работает, но верный выводить оно не будет,а только все неверные. По крайней мере я уже пробовал, так оно и есть.

Вопрос решил по другому

PHP
1
2
3
4
5
6
7
8
9
10
11
$q_id = rand(1,5);
 
$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 AND q_id=$q_id  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 AND q_id=$q_id ORDER BY RAND() LIMIT 3)
             ORDER BY RAND()
                            ";
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
31.12.2015, 14:48  [ТС] 7
SQL
1
2
3
4
5
6
7
8
9
10
11
$q_id = rand(1,5);
 
$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 AND q_id=$q_id  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 AND q_id=$q_id ORDER BY RAND() LIMIT 3)
             ORDER BY RAND()
                            ";
Подскажите как можно заменить rand .
Мне нужно генерировать случайный вопрос в этом запросе не в самом php а на уровне запроса

мне сначала нужно сгенерировать случайный ID вопроса, а потом по нему вывести все остальное
0
31.12.2015, 14:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2015, 14:48
Помогаю со студенческими работами здесь

union как определить из какой таблице запись после UNION?
Подскажите пожалуйста! Вот например две таблице (TEBLE_1) у которой поля row_1(BIGINT) и (TABLE_2)...

Что не так с 'Random' или There is no overloaded version of 'Random' that can be called with these arguments
Доброго времени суток! Я с программированием на &quot;Вы&quot;, поэтому очень прошу доходчиво объяснить, что...

Random, повторы при static Random(1 seed)
Добрый вечер. Использую private static readonly Random, так как крутится в цикле и если убрать...

У меня непонятки с методами Math.random() и Random()
Задача : заполнить массив из 15 элементов случайным образом вещественными значениями х (-5 &lt;= x &lt;=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru