Forum Webscript.Ru

Общие => Базы данных => Тема начата: Enemy от 06 Марта 2004, 13:37:56

Название: выборка последних записей
Отправлено: Enemy от 06 Марта 2004, 13:37:56
Структура моих таблиц (vbulletin)-
--------------
thread (темы)
 threadid  title  lastpost  forumid  pollid  open  replycount  .....
--------------
post (сообщения)
 postid  threadid  username  userid  title  dateline .....
--------------

мне нужно выбрать с таблицы post последних 5 сообщений с разных тем + обьединить по threadid с thread эти записи...

вот мой sql query:
"SELECT DISTINCT p.threadid,p.*,t.title AS titlethread,t.replycount FROM post p LEFT JOIN thread t ON p.threadid=t.threadid ORDER BY dateline DESC LIMIT 0,5"

работает некоректно...
Название: выборка последних записей
Отправлено: alex007 от 06 Марта 2004, 20:10:47
Enemy
А на родине не мог посмотреть где продукт разрабатывали, так как умельцы по этому делу наверника что-то разработали и создали хак!

И во вторых
Цитировать
5 сообщений с разных тем

не получится, так как у тебя по dateline сортируется дело, поэтому только выйдут пять последних сообщения.
Название: выборка последних записей
Отправлено: Maniac от 07 Марта 2004, 02:14:16
Enemy
Тебе нужно выбрать по пять последних из всех тем или по одному последнему из пяти разных тем?
Название: выборка последних записей
Отправлено: Enemy от 09 Марта 2004, 14:21:17
Maniac
по одному последнему из пяти разных тем
Название: выборка последних записей
Отправлено: Макс от 09 Марта 2004, 18:07:01
попробуй так:
SELECT DISTINCT
p.threadid,p.*,t.title AS titlethread,t.replycount, [b]MAX(dateline)[/b]
FROM
post p
LEFT JOIN thread t ON p.threadid=t.threadid
[b]GROUP BY p.thread_id[/b]
ORDER BY dateline DESC LIMIT 0,5
Название: выборка последних записей
Отправлено: Enemy от 09 Марта 2004, 18:46:29
Макс

SELECT DISTINCT
p.threadid,p.*,t.title AS titlethread,t.replycount, MAX(p.dateline)
FROM
post p
LEFT JOIN thread t ON p.threadid=t.threadid
GROUP BY  p.threadid
ORDER BY dateline DESC LIMIT 0,5

Все равно не то... Темы разные но сообщения выбирает не последние - выводит или первое сообщение темы или 2,3 короче совсем непонятно...
Название: выборка последних записей
Отправлено: Макс от 09 Марта 2004, 19:55:07
я не знаком со структурой таблиц ВБулетня.
dateline - это дата создания сообщения ?

Попробуй еще такой вариант (он с точки зрения теории неправильный, но в данном случае может сработать):
SELECT
p.threadid,p.*,t.title AS titlethread,t.replycount, [b]MAX(p.postid)[/b]
FROM
post p
LEFT JOIN thread t ON p.threadid=t.threadid
GROUP BY p.thread_id
ORDER BY p.postid DESC LIMIT 0,5
Название: выборка последних записей
Отправлено: Enemy от 09 Марта 2004, 20:11:02
Макс
Ничего не изменилось работает и возвращает тот же результат что и предидущий запрос...

Вот структура таблиц:

[B]TABLE `post`[/B] (
  `postid` int(10) unsigned NOT NULL auto_increment,
  `threadid` int(10) unsigned NOT NULL default \'0\',
  `username` varchar(50) NOT NULL default \'\',
  `userid` int(10) unsigned NOT NULL default \'0\',
  `title` varchar(100) NOT NULL default \'\',
  `dateline` int(10) unsigned NOT NULL default \'0\',
  `attachmentid` smallint(5) unsigned NOT NULL default \'0\',
  `pagetext` mediumtext NOT NULL,
  `allowsmilie` smallint(6) NOT NULL default \'0\',
  `showsignature` smallint(6) NOT NULL default \'0\',
  `ipaddress` varchar(16) NOT NULL default \'\',
  `iconid` smallint(5) unsigned NOT NULL default \'0\',
  `visible` smallint(6) NOT NULL default \'0\',
  `edituserid` int(10) unsigned NOT NULL default \'0\',
  `editdate` int(10) unsigned NOT NULL default \'0\',
  PRIMARY KEY  (`postid`),
  KEY `iconid` (`iconid`),
  KEY `userid` (`userid`),
  KEY `threadid` (`threadid`,`userid`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

[B]TABLE `thread`[/B] (
  `threadid` int(10) unsigned NOT NULL auto_increment,
  `title` varchar(100) NOT NULL default \'\',
  `lastpost` int(10) unsigned NOT NULL default \'0\',
  `forumid` smallint(5) unsigned NOT NULL default \'0\',
  `pollid` int(10) unsigned NOT NULL default \'0\',
  `open` tinyint(4) NOT NULL default \'0\',
  `replycount` int(10) unsigned NOT NULL default \'0\',
  `postusername` varchar(50) NOT NULL default \'\',
  `postuserid` int(10) unsigned NOT NULL default \'0\',
  `lastposter` varchar(50) NOT NULL default \'\',
  `dateline` int(10) unsigned NOT NULL default \'0\',
  `views` int(10) unsigned NOT NULL default \'0\',
  `iconid` smallint(5) unsigned NOT NULL default \'0\',
  `notes` varchar(250) NOT NULL default \'\',
  `visible` smallint(6) NOT NULL default \'0\',
  `sticky` smallint(6) NOT NULL default \'0\',
  `votenum` smallint(5) unsigned NOT NULL default \'0\',
  `votetotal` smallint(5) unsigned NOT NULL default \'0\',
  `attach` smallint(5) unsigned NOT NULL default \'0\',
  PRIMARY KEY  (`threadid`),
  KEY `iconid` (`iconid`),
  KEY `forumid` (`forumid`,`visible`,`sticky`,`lastpost`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
Название: выборка последних записей
Отправлено: Макс от 09 Марта 2004, 20:25:23
Попробуй так

SELECT p.postid, MAX(dateline)
FROM post p
GROUP BY p.thread_id
DESC LIMIT 0,5

получишь 5 post_id. Запомни их и выполни:

SELECT p.*,t.title AS titlethread,t.replycount
FROM post p , thread t WHERE p.threadid=t.threadid AND p.postid IN (1,2,3,4,5)
DESC LIMIT 0,5
где 1,2,3,4,5 - те значения, которые дал первый запрос.
Результат правильный ?
Название: выборка последних записей
Отправлено: Enemy от 10 Марта 2004, 19:51:15
Цитировать
Попробуй так
SELECT p.postid, MAX(dateline)
FROM post p
GROUP BY p.thread_id
DESC LIMIT 0,5



так работало но выбирало не то... короче я переделал так и заработало -

SELECT [COLOR=red]MAX(p.postid)[/COLOR] FROM post p GROUP BY [COLOR=red]p.threadid[/COLOR] DESC LIMIT 0,5


Цитировать
получишь 5 post_id. Запомни их и выполни:

SELECT p.*,t.title AS titlethread,t.replycount
FROM post p , thread t WHERE p.threadid=t.threadid AND p.postid IN (1,2,3,4,5)
[COLOR=red]DESC LIMIT 0,5[/COLOR]



здесь DESC глючил без ORDER и я его убрал


SELECT p.*,t.title AS titlethread,t.replycount FROM post p, thread t WHERE p.threadid=t.threadid AND p.postid IN ($ids) LIMIT 0,5

Теперь все работает. Большущее спасибо Макс