Пожалуйста, помогите с запросом
Не могу составить запрос что бы получить все новости и к каждой новости n комментариев.
Всем спасибо
синтаксис sql запросов собрал это
SELECT новости FROM таблица_новости UNION SELECT комментарии FROM таблица_комментарии LIMIT n
Из первой ссылки, который дал google
SELECT новости FROM таблица_новости UNION SELECT комментарии FROM таблица_комментарии LIMIT n
Цитата: Charley
Из первой ссылки, который дал google синтаксис sql запросов собрал это
SELECT новости FROM таблица_новости UNION SELECT комментарии FROM таблица_комментарии LIMIT n
SELECT новости FROM таблица_новости UNION SELECT комментарии FROM таблица_комментарии LIMIT n
Насколько я понимаю, UNION немного не то делает что нужно мне. wikipedia - union
мне нужен следующий результат после запроса:
массив состоящий из полей - титл, текст, и т. д., комментарии - тоже массив из n элементов (имя, текст, и т. д.), взятых из таблицы комментариев
тут Хотя по твоему посту я не могу понять, что тебе нужно.
Если тебе надо вернуть векторное произведение строк из двух таблиц, удовлетворяющее какому-то условию почитай
Цитата: maxbusko
мне нужен следующий результат после запроса:
массив состоящий из полей - титл, текст, и т. д., комментарии - тоже массив из n элементов (имя, текст, и т. д.), взятых из таблицы комментариев
Тогда для каждого из - выбирай отдельным запросом комментарии
пример. На основании него сделал так:
Вопрос в СУБД. Как я понял, нужно "лимитированное" слияние таблиц. Для MySQL нашел похожий
Код:
SELECT rep_tab.id, rep_tab.title, com_tab.text
FROM report AS rep_tab
INNER JOIN comment AS com_tab
ON rep_tab.id = com_tab.report_id AND IF(@id = rep_tab.id, @rownum := @rownum + 1, @rownum := 1 + LEAST(0, @id := rep_tab.id)) <= ...N...,
(SELECT @rownum := 1, @id := 0) AS var_tab ORDER BY rep_tab.id ASC
FROM report AS rep_tab
INNER JOIN comment AS com_tab
ON rep_tab.id = com_tab.report_id AND IF(@id = rep_tab.id, @rownum := @rownum + 1, @rownum := 1 + LEAST(0, @id := rep_tab.id)) <= ...N...,
(SELECT @rownum := 1, @id := 0) AS var_tab ORDER BY rep_tab.id ASC
Вряд ли такое возможно. Если требуется вывод, то придется отслеживать идентификатор новости (rep_tab.id) в очередной строке результата, что, впрочем, нетрудно, т.к. строки по нему и отсортированы.
Пусть
1. Таблица НОВОСТИ (ИД, ТИТЛ, ТЕКСТ)
2. Таблица КОММЕНТАРИИ (ИД, НОВОСТЬИД, ДАТАВРЕМЯ, ТЕКСТ)
Создаем представление данных (CREATE VIEW) в виде всех пронумерованных комментариев по каждой новости; порядок нумерования определяется некоторым полем, например, есть такое поле ДАТАВРЕМЯ.
ТС! Вы не указали СУБД! Будет ХЗ-SQL, но должно работать везде.
Код:
CREATE OR REPLACE VIEW НУМЕРКОМЕНТАРИИ AS
SELECT
НК.ИД,
НК.НОВОСТЬИД,
НК.ДАТАВРЕМЯ,
НК.ТЕКСТ,
(SELECT COUNT(*) FROM КОММЕНТАРИИ AS К WHERE K.ДАТАВРЕМЯ <= НК.ДАТАВРЕМЯ AND К.НОВОСТЬИД=НК.НОВОСТЬИД) AS РАНК
FROM
КОММЕНТАРИИ AS НК;
SELECT
НК.ИД,
НК.НОВОСТЬИД,
НК.ДАТАВРЕМЯ,
НК.ТЕКСТ,
(SELECT COUNT(*) FROM КОММЕНТАРИИ AS К WHERE K.ДАТАВРЕМЯ <= НК.ДАТАВРЕМЯ AND К.НОВОСТЬИД=НК.НОВОСТЬИД) AS РАНК
FROM
КОММЕНТАРИИ AS НК;
Остается самое простое выбрать.
Код:
SELECT
Н.ИД,
Н.ТИТЛ,
Н.ТЕКСТ,
НК.ИД,
НК.ДАТАВРЕМЯ,
НК.ТЕКСТ
FROM
НОВОСТЬ AS Н,
НУМЕРКОММЕНТАРИИ AS НК
WHERE
Н.ИД = НК.НОВОСТЬИД AND
НК.РАНК >= 1 AND НК.РАНК <= 5
ORDER BY
Н.ИД,
НК.ДАТАВРЕМЯ;
Н.ИД,
Н.ТИТЛ,
Н.ТЕКСТ,
НК.ИД,
НК.ДАТАВРЕМЯ,
НК.ТЕКСТ
FROM
НОВОСТЬ AS Н,
НУМЕРКОММЕНТАРИИ AS НК
WHERE
Н.ИД = НК.НОВОСТЬИД AND
НК.РАНК >= 1 AND НК.РАНК <= 5
ORDER BY
Н.ИД,
НК.ДАТАВРЕМЯ;