Mysql отношения один ко многим - PullRequest
0 голосов
/ 06 июля 2011

У меня есть две таблицы:

ТАБЛИЦЫ с полем IDItem ТАБЛИЦА комментариев с полями IDcomment, IDItem, datePublished и comment.

Если я хочу перечислить последние 10 комментариев, это не проблема, я просто сортирую таблицу «комментарии». Проблема в том, что когда я хочу перечислить последние десять комментариев по отдельным элементам, это означает, что элементы не дублируются.

Есть ли лучший способ достичь этого в отношении использования индексов? Если я упорядочиваю по «комментариям» и группирую по IDItem, я не получаю последний комментарий по каждому элементу, так как группа выглядит упорядоченной случайным образом: - (

Я нашел решение перенести 'lastDate' в таблицу 'items', чтобы я мог сортировать по элементам, и у меня будет правильный порядок сортировки, но когда я присоединяюсь к таблице комментариев, я получаю 10 строк одного и того же элемента ID, если было 10 комментариев: - (

Как правильно соединить один со многими, чтобы я получил только один элемент из левой таблицы и один элемент из правой таблицы?

Я не уверен, был ли я очень ясен.

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Звучит так, как будто вы пытаетесь получить 10 возвращенных элементов, которые имеют последние 10 комментариев, с одним правильным комментарием на элемент?

Если так, попробуйте это:

SELECT * FROM Items I
JOIN
(SELECT TOP 10 * FROM Comments C2 WHERE DatePublished=
       (SELECT MAX(DatePublished) FROM Comments C3 WHERE C2.IDItem=C3.IDItem)
       ORDER BY DatePublished DESC) C1
ON I.IDItem=C1.IDItem

Отредактировано: удален дополнительный SELECT и добавлено ограничение в 10 комментариев

0 голосов
/ 06 июля 2011
DECLARE @item TABLE
(
  IDItem int
)
DECLARE @comment TABLE
(
  IDComment int,
  DatePublished date,
  IDItem int,
  Comment varchar(100)
)

INSERT INTO @item (IDItem) VALUES (1);
INSERT INTO @item (IDItem) VALUES (2);
INSERT INTO @item (IDItem) VALUES (3);
INSERT INTO @item (IDItem) VALUES (4);

INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (1,'2011-01-01', 1, 'test1');
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (2,'2011-01-02', 1, 'test2');
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (3,'2011-01-01', 2, 'test3');
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (4,'2011-01-03', 2, 'test4');
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (5,'2011-01-02', 3, 'test5');
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (6,'2011-01-05', 3, 'test6');

SELECT i.IDItem, (SELECT TOP 1 c.Comment FROM @comment c WHERE c.IDItem = i.IDItem ORDER BY c.DatePublished) FROM @item i

ВОЗВРАЩАЕТСЯ

   1    test1
   2    test3
   3    test5
   4    NULL

Если это то, что вы ищете, просто mysql этот код.Замените TOP 1 на LIMIT 1 и т. Д.

0 голосов
/ 06 июля 2011

(обновлено) Как насчет этого?

SELECT IDcomment, IDitem from COMMENTS where IDitem in (SELECT DISTINCT(IDitem) FROM comments); 
...