Выборка неповторяющихся записей из таблицы

Статус
В этой теме нельзя размещать новые ответы.

kwin

Постоялец
Регистрация
22 Авг 2007
Сообщения
413
Реакции
167
Здравствуйте, помогите пожалуйста правильно организовать запрос к БД(mysql).

Имеется 2 таблицы:

`comments` - коментарии

id | post_id | autor| date

и `post`- статьи

id | autor | date | title


На данный момент запрос выглядит так:

PHP:
SELECT comments.post_id, comments.id as comm_id, comments.autor, post.id, post.date as newsdate, post.title FROM pref_comments as comments, pref_post as post WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0,10

Задача — выбрать 10 последних коментов, при этом id статиь не должно повторяться.


Краткий пример

Сейчас выводять все подряд:

Статья - anonym
Статья - anonym
Статья2 - admin

Надо только по последнему коменту из каждой статьи:

Статья - anonym
Статья2 - admin


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

Заранее спасибо.
 
добавь GROUP BY
т.е.
Код:
SELECT comments.post_id, comments.id as comm_id, comments.autor, post.id, post.date as newsdate, post.title FROM pref_comments as comments, pref_post as post WHERE post.id=comments.post_id GROUP BY comments.post_id ORDER BY comments.date DESC LIMIT 0,10

кстати тут совсем рядом есть раздел Базы данных
почему тема не там?
 
К сожалению GROUP BY comments.post_id не дал ожидаемых результатов, выводит непонятно по каким критериям ...

Насчет раздела возможно и вправду ошибся.
 
попробуй

Код:
SELECT distinct comments.post_id, comments.id as comm_id, comments.autor, post.date as newsdate, post.id, post.title 
FROM pref_comments as comments, pref_post as post 
WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0,10
поскольку нету таблиц то не могу проверить, но по логике должно помочь
 
попробуй

Код:
SELECT distinct comments.post_id, comments.id as comm_id, comments.autor, post.date as newsdate, post.id, post.title 
FROM pref_comments as comments, pref_post as post 
WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0,10
поскольку нету таблиц то не могу проверить, но по логике должно помочь

а еще лучше

Код:
SELECT distinct comments.post_id, comments.id as comm_id, comments.autor, post.date as newsdate, post.id, post.title
FROM pref_post as post 
  LEFT JOIN pref_comments as comments 
    ON post.id=comments.post_id 
ORDER BY comments.date DESC 
LIMIT 0,10

чтобы база не перелопачивала полное пересечение таблиц pref_comments и pref_post
 
pslava, nuke333
Ваши sql запросы не удаляют повторяющиеся строки
результат будет таков:
Код:
post_id 	comm_id 	autor 	date 	newsdate 	id 	title 
1	5	6	2009-03-15	2009-03-04	1	ddjdjddd
2	7	6	2009-03-15	2009-03-11	2	2wwwwwwwwwwwwww
1	4	6	2009-03-14	2009-03-04	1	ddjdjddd
1	2	2	2009-03-13	2009-03-04	1	ddjdjddd
1	1	1	2009-03-12	2009-03-04	1	ddjdjddd
2	3	3	2009-03-10	2009-03-11	2	2wwwwwwwwwwwwww
1	8	7	2009-03-04	2009-03-04	1	ddjdjddd

а нужен
Код:
post_id 	comm_id 	autor 	date 	newsdate 	id 	title 
1	5	6	2009-03-15	2009-03-04	1	ddjdjddd
2	7	6	2009-03-15	2009-03-11	2	2wwwwwwwwwwwwww

я добавил колонку date - дата комента для наглядности


kwin:
устроит запрос с временными таблицами?
Код:
CREATE TEMPORARY TABLE tmp_table (
  `post_id` int(11) NOT NULL,
  `comm_id` int(11) NOT NULL,
  `autor` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `date` date NOT NULL,
  `newsdate` date NOT NULL,
  `title` text
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO tmp_table SELECT comments.post_id, comments.id as comm_id, comments.autor, post.id, comments.date, post.date as newsdate, post.title FROM comments, post WHERE post.id=comments.post_id ORDER BY comments.post_id, comments.date DESC;

SELECT * FROM tmp_table GROUP BY id LIMIT 0,10;

DROP TABLE tmp_table;
 
так скинь эти таблицы, иначе будут только гипотезы, без проверок.
Хочь результат - дам материал на чем тестировать:)
 
pslava мне не в падлу было набить тестовый пример в phpmyadmin
делов то 5 минут, гуглить решени было дольше
Код:
-- 
-- Структура таблицы `comments`
-- 

DROP TABLE IF EXISTS `comments`;
CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  `autor` int(11) NOT NULL,
  `date` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- 
-- Дамп данных таблицы `comments`
-- 

INSERT INTO `comments` (`id`, `post_id`, `autor`, `date`) VALUES 
(1, 1, 1, '2009-03-12'),
(2, 1, 2, '2009-03-13'),
(3, 2, 3, '2009-03-10'),
(4, 1, 6, '2009-03-14'),
(5, 1, 6, '2009-03-15'),
(7, 2, 6, '2009-03-15'),
(8, 1, 7, '2009-03-04');

-- --------------------------------------------------------

-- 
-- Структура таблицы `post`
-- 

DROP TABLE IF EXISTS `post`;
CREATE TABLE IF NOT EXISTS `post` (
  `id` int(11) NOT NULL,
  `autor` int(11) NOT NULL,
  `date` date NOT NULL,
  `title` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- 
-- Дамп данных таблицы `post`
-- 

INSERT INTO `post` (`id`, `autor`, `date`, `title`) VALUES 
(1, 1, '2009-03-04', 'ddjdjddd'),
(2, 2, '2009-03-11', '2wwwwwwwwwwwwww');

хотя с реальными данными наверно лучше
 
  • Нравится
Реакции: kwin
сейчас возвращает 2 строки
Код:
SELECT distinct comments.post_id, comments.id as comm_id, comments.autor, post.date as newsdate, post.id, post.title 
FROM comments, post 
WHERE post.id=comments.post_id 
group by comments.post_id
ORDER BY comments.date DESC LIMIT 0,10
названия таблиц подредактировал,
к ТС скинь реальные даннные строк по 20 с таблицы
 
pslava,
это невреное решение,я его уже предлагал, см. второй пост.
distinct тут нафиг не уперся, убери его и ты изменения не увидишь.

(для потверждения неверности решения смотри автора
он должен быть 6, именно 6 юзер написал последний коммент, а не 1)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху