Нужна помощь по созданию sql запроса

VL-ad

Новичок
Дарова мужики, нужна Ваша помощь.
Помогите составить запрос на получение, последних 15 записей с комментариями, и вывести по 3 посл.комментария к этим записям, записи не должны дублироваться и отображаться только те в которых в течении недели были добавлены комментарии.

PHP:
CREATE TABLE `posts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
);
PHP:
CREATE TABLE `comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `postid` int(10) unsigned NOT NULL DEFAULT '0',
  `text` text NOT NULL,
  `added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
);
Кто нибудь уже это делал, поделитесь пожалуйста.. :)

пример тут: http://vkontakte.ru/feed?section=comments
 

VL-ad

Новичок
У меня его нет, я пытался но толкового ничего не вышло.
к тому же вариант получилось очень не оптимизированным %)
 

Semen

Семён
делай поэтапно
с начало сделай выборку последних 15 записей
 

Вурдалак

Продвинутый новичок
Скорее всего я бы добавил поле в таблице posts, где перечислялись бы id'ы последних комментариев к этой статье. Тогда можно уложиться в 2 запроса.
 

VL-ad

Новичок
PHP:
SELECT DISTINCT c.postid, p.name FROM comments AS c
LEFT JOIN posts AS p ON p.id = c.postid
WHERE c.added >= DATE_ADD(NOW(), INTERVAL -7 DAY)
ORDER BY c.added DESC LIMIT 15
с начало выборка уник комментов за посл 7 дней, потом внутри while запрос на получение 3ёх комментов, и того 16 запросов %)
не очень как то, но получилось сделать всё как и хотел, но думаю можно проще и оптимизированнее, чем мой вариант..
 

VL-ad

Новичок
Э.. есть время, забыл дописать извиняюсь.
PHP:
`added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
Плюс пояснить, что он подразумевает под "записи не должны дублироваться".
Не должно отображать одинаковые посты, к примеру "ромашка (3 коммента), ромашка (3 коммента), розы (2 коммента)" ))
 

Semen

Семён
если бы был dump базы, можно было бы поэкспериментировать.
попробуй так
PHP:
SELECT * FROM `posts` AS p, `comments` AS c
WHERE `p`.`id`=`c`.`postid`
AND `c`.`added` >= DATE_ADD(NOW(), INTERVAL -7 DAY)
LIMIT 15

$postsId = array();
while($post = mysql_fetch...){
	$postsId[] = $post['id'];
}
$in = implode(',', $postsId);

SELECT * FROM `comments`
WHERE `postid` IN ('.$in.')
AND `added` >= DATE_ADD(NOW(), INTERVAL -7 DAY)
 

Semen

Семён
Ну и где выполнения условий задачи? ;)
В частности:
- Помогите составить запрос
- вывести по 3 посл.комментария
первым запросом получили id posts у которых есть сообщения за последнею неделю (надо добавить DISTINCT c.postid)
вторым - сообщения за последнею неделю этих posts
вывели >=3 посл.комментария каждого post
 

VL-ad

Новичок
>= 3 ? а если по 100 к каждому посту будет? 100 * 15 = 1500 - записей будет выбирать 1-3 сек %)
- запрос, т.е. один запрос, - у Вас два
Не важно в один запрос, можно и 2-3, главное что-бы быстрые были и не грузили базу, но не 16 как у меня сейчас, хотя бы потому что это тупо.
По сути осталось получить по 3 коммента к записям одним запросом, что то типо HAVING`a
возможно типо того:
PHP:
SELECT * FROM commets AS c WHERE c.postid IN(1,3,91,51) GROUP BY c.postid HAVING c.postid <= 3
Но я не знаю как точно это сделать..
 

Semen

Семён
>= 3 ? а если по 100 к каждому посту будет? 100 * 15 = 1500 - записей будет выбирать 1-3 сек %)
ну тогда лучше ещё одну таблицу, которая обновляется при новом комментарии IMHO
если бы был dump базы, можно было бы поэкспериментировать.
 

VL-ad

Новичок
если бы был dump базы, можно было бы поэкспериментировать.
PHP:
-- ----------------------------
-- Table structure for comments
-- ----------------------------
CREATE TABLE `comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `postid` int(10) unsigned NOT NULL DEFAULT '0',
  `text` varchar(255) NOT NULL,
  `added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=UTF8;

-- ----------------------------
-- Table structure for posts
-- ----------------------------
CREATE TABLE `posts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=UTF8;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `comments` VALUES
('1', '1', 'comment #1', '2011-03-25 14:24:53'),
('2', '1', 'comment #2', '2011-03-21 14:25:54'),
('3', '2', 'comment #3', '2011-04-25 14:26:30'),
('4', '2', 'comment #4', '2011-04-25 14:26:28'),
('5', '2', 'comment #5', '2011-04-25 14:26:33'),
('6', '3', 'comment #6', '2011-04-25 14:27:12'),
('7', '3', 'comment #7', '2011-04-25 14:27:12');
INSERT INTO `posts` VALUES
('1', 'Name 1', '2011-04-25 14:24:02'),
('2', 'Name 2', '2011-04-25 14:24:10'),
('3', 'Name 3', '2011-04-25 14:24:39'),
('4', 'Name 4', '2011-04-25 14:25:21');
 

VL-ad

Новичок
И накой тебе дамп? добавить записей, 3 секунды.
PHP:
for($i = 5; $i <= 1000; ++$i){
mysql_query("INSERT LOW_PRIORITY INTO comments SET postid = ".rand(1, 4).", text = 'comment #".$i."', added = NOW()") or die('error');
}
 

VL-ad

Новичок
Chusha, кол-во всего то - около 1000, индексы на id, added, и postid, added
а первый поправлю, и проверю завтра.
Спасибо.
 
Сверху