SQL запрос

12
frantic
На сайте с 09.02.2009
Offline
27
715

Всем привет!

Вот есть таблица с вопросами, типа голосование на сайте. А есть таблица с ответами. как одним запросом вывести случайный вопрос и все варианты ответов на него? ( СУБД MySQL )

Пробовал так:

SELECT *

FROM `options` AS `a`
WHERE `po_question` = (
SELECT `pq_id`
FROM `questions`
ORDER BY RAND()
LIMIT 1
)
UNION
SELECT *
FROM `options` AS `b`
WHERE `b`.`po_question` = `a`.`po_question`

не работает, т.к. не видит алиас `a`

пробовал так:

SELECT *

FROM `options`
WHERE `po_question` IN (
SELECT `pq_id`
FROM `questions`
ORDER BY RAND()
LIMIT 1
)

Не работает, пишет:

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

и так тоже не пашет:

SELECT *

FROM `options`
WHERE `po_question` = (
SELECT `pq_id`
FROM `questions`
ORDER BY RAND()
LIMIT 1
)
T.R.O.N
На сайте с 18.05.2004
Offline
314
#1

frantic,

один вопрос, а зачем вопросы и ответы нужно было хранить в разных местах, если они являются неотъемлемыми частями друг-друга? Может стоит сначала сделать базу нормально?

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
frantic
На сайте с 09.02.2009
Offline
27
#2

T.R.O.N, ну а как же нормализация данных? Это будет вопрос 10 раз повторяться на 10 ответов?

T.R.O.N
На сайте с 18.05.2004
Offline
314
#3

frantic, а записи с десятью текстовыми полями разве не бывает? Если вообще есть смысл каждый ответ хранить в отдельном поле....

frantic
На сайте с 09.02.2009
Offline
27
#4
T.R.O.N:
frantic, а записи с десятью текстовыми полями разве не бывает? Если вообще есть смысл каждый ответ хранить в отдельном поле....

не, каждый ответ хранится в отдельной строке, а не в отдельном поле.


po_id po_question po_option
29 2 Нормально
28 2 Хорошо
22 2 Очень плохо
T.R.O.N
На сайте с 18.05.2004
Offline
314
#5
frantic:
каждый ответ хранится в отдельной строке, а не в отдельном поле.

мдя... кажется я что-то пропустил... А зачем такая структура, которой очень-очень неудобно пользоваться?

* id * вопрос * ответ 1 *... ответ 20 * номер верного *

либо, что куда удобней на мой вкус

* id * вопрос * все ответы (как строки внутри одного поля) * номер верного *

Кроме всего остального, Вам нужно делать несколько запросов или один составной вместо единичного... Это ведь не логично...

frantic
На сайте с 09.02.2009
Offline
27
#6
T.R.O.N:
* id * вопрос * все ответы (как строки внутри одного поля) * номер верного *

не не. там нет верного и неверного. это обычное голосование. а насчет "строки внутри одного поля" я не понял...

T.R.O.N
На сайте с 18.05.2004
Offline
314
#7

frantic,

текст разделенный на строки (\n). Каждый вариант в своей строке. Хотя для ОПРОСА, лучше первый предложенный мной вариант, ибо в нем легче сопоставлять ответы с вариантами

N
На сайте с 06.05.2007
Offline
419
#8

T.R.O.N, так слово нор-ма-ли-за-ция вам не знакомо или вы все-таки изучили плюсы и минусы и являетесь убежденным ее противником ?

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

есть такая бяка.

У вас же есть дамп с тестовыми данным? выкладывайте. Ну или хотя бы дамп без данных.

Всех в этом разделе ломает по вашему описанию воссоздавать структуру таблиц, а если есть дамп - все гораздо легче.

Пока могу сказать, что order by rand() нужно применять очень осторожно и желательно результат где-нибудь покешировать. либо выбирать данные с ограничением за последний, допустим месяц.

Кнопка вызова админа ()
T.R.O.N
На сайте с 18.05.2004
Offline
314
#9
netwind:
так слово нор-ма-ли-за-ция вам не знакомо или вы все-таки изучили плюсы и минусы и являетесь убежденным ее противником ?

жаль что для вас нормализация и здравый смысл находятся по разным сторонам жизни.... зачем усложнять самые элементарные вещи. Безусловно, чтобы забить гвоздь, можно вместо молотка использовать нечто универсальное, что подойдет для бесконечного множества вариантов задач...

просто Вам нравятся универсальные решения (т.с.), я сторонник самых простых и естественных

frantic
На сайте с 09.02.2009
Offline
27
#10

CREATE TABLE IF NOT EXISTS `options` (
`po_id` smallint(4) NOT NULL auto_increment,
`po_question` tinyint(2) NOT NULL,
`po_option` varchar(64) collate utf8_bin default NULL,
PRIMARY KEY (`po_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


INSERT INTO `options` (`po_id`, `po_question`, `po_option`) VALUES
(1, 1, 'Отлично'),
(2, 1, 'Хорошо'),
(3, 1, 'Плохо'),
(4, 2, 'Каждый день'),
(5, 2, 'Редко'),
(6, 2, 'Никогда');


CREATE TABLE IF NOT EXISTS `questions` (
`pq_id` tinyint(2) NOT NULL,
`pq_question` varchar(256) collate utf8_bin default NULL,
PRIMARY KEY (`pq_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


INSERT INTO `questions` (`pq_id`, `pq_question`) VALUES
(1, 'Как вы оцениваете дизайн сайта?'),
(2, 'Как часто вы посещаете зоопарк?');

frantic добавил 15.02.2010 в 15:11

netwind:
желательно результат где-нибудь покешировать

А как это?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий