Объединить в один запрос

Grapefruit Lips

Новичок
Объединить в один запрос

Всем привет

Есть две таблицы вопросов и ответов:

id | vopros
1 | Почему?
2 | Зачем?

id | vopr_id | otvet
1 | 1 | потому
2 | 1 | потому что
3 | 2 | затем

Надо вывести по одному вопросу и по *5* ответов к каждому.

Пробую:

[SQL]SELECT
vop.id AS qu_id,
vop.vopros AS que,
answers.vopr_id AS ans_id,
answers.otvet AS otvet
FROM vop
LEFT JOIN answers
ON (vop.id=answers.ans_id)
GROUP BY ans_id
ORDER BY qu_id DESC
[/SQL]

У меня выводится по одному вопросу и по одному ответу =(( :
1. Почему? - потому
2. Зачем? - затем

А надо по одному вопросу и *5* ответов на этот вопрос:
1. Почему? - потому
- потому что
2. Зачем? - затем

Т.е. ответов может быть и 5, и 6 и 10 для каждого вопроса

-~{}~ 27.09.06 14:19:

А, наверное GROUP BY otvet )
 

b-d

Новичок
Grapefruit Lips,

Интересная задачка.. Если количество и размер ответов для каждого вопроса не очень большое, то можно перенести обработку в код. Например так:

Код:
SELECT vop.id,vopros,GROUP_CONCAT(otvet)
FROM vop,answers
WHERE (vop.id = answers.vopr_id)
GROUP BY vop.id;
Это даст такой результат:
(id) - (vopros) - (otvet#1,otvet#2,otvet#3,..,otvet#n)


Отсюда можно извлечь 5 ответов.. Однако, если количество ответов или их длина велики, то эту задачу нужно решить при помощи SQL. Оч.интересно! Будем думать... Здесь нужно ограничить множество ответов для каждой группы.. но как это сделать? Эх..
 

ru_skol

Новичок
Если надо извлечь все ответы к вопросу, то просто убери GROUP BY ...
 

b-d

Новичок
Можно усложнить ввод/удаление записей в таблицу ответов. Вводить ответы для вопросов в порядке релевантности и вести нумерацию начиная с 1. Тогда можно очень просто получить нужное количество ответов. В предложении WHERE оставить ограничение <= 5..

Определим таблицы так:
q (таблица вопросов):
Код:
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned |      | PRI | NULL    | auto_increment |
| text  | varchar(100)     |      |     |         |                |
+-------+------------------+------+-----+---------+----------------+
a (таблица ответов):
Код:
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned |      | PRI | 0       |       |
| a_id  | int(10) unsigned |      | PRI | 0       |       |
| text  | varchar(100)     |      |     |         |       |
+-------+------------------+------+-----+---------+-------+

Тогда, чтобы получить нужное количество ответов для каждого вопроса (считаем что столбец "a_id" вводился в порядке релевантности) используем такой запрос:

Код:
SELECT q.id, q.text, GROUP_CONCAT(a.text)
FROM q,a
WHERE (q.id = a.id) AND (a.a_id <= 5)
GROUP BY q.id;

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

Код:
SELECT q.id, q.text, GROUP_CONCAT(a.text) 
FROM q,a 
WHERE (q.id = a.id) AND 
      (a.a_id IN (SELECT a1.a_id 
                  FROM a AS a1, a AS a2 
                  WHERE (a1.id = a.id) AND (a2.id = a.id) AND 
                        (a1.text < a2.text) 
                  GROUP BY a1.text 
                  HAVING COUNT(*) <= 5 
))
GROUP BY q.id;
 
Сверху