0

最新の投稿日または最新のコメント日付のいずれかで行ごとに並べ替えようとしているクエリがあります。

投稿には多くのコメントが含まれる可能性があるため、各行の最大コメント日付を取得する必要があります。postdate が commentdate より大きい場合、cdate = postdate、そうでない場合、cdate = max commentdate です。

私はこれを使用してこれを達成しようとしています:

CASE WHEN max(wc.date_created) > wp.date_created THEN max(wc.date_created) ELSE wp.date_created END AS cdate

ORDER BY cdate DESC

どんな助けでも大歓迎です。

完全なクエリは次のとおりです (すべての行のコメント日付が cdate に設定されているようです)。

SELECT DISTINCT wp.p_id, wp.type, wp.value, wp.media, wp.youtube, wp.post_type, wp.tagedpersons, wp.title AS thetitle, wp.url, wp.description, wp.cur_image, wp.uip, wp.likes, wp.userid, wp.posted_by, wp.post AS postdata, wu . * , UNIX_TIMESTAMP( ) - wp.date_created AS TimeSpent, wp.date_created, wp.course, 
CASE WHEN max(wc.date_created) > wp.date_created THEN max(wc.date_created) ELSE wp.date_created END AS cdate
FROM wallposts wp
INNER JOIN wallusers wu ON wu.mem_id = wp.userid
INNER JOIN wallcomments wc ON wc.post_id = wp.p_id
WHERE (
          wp.userid IN (".$matches.") OR 
          (wp.userid IN (".$courses.") AND wp.course = 1)  OR 
          wp.userid =".$user_id." OR
          wp.tagedpersons LIKE '%".$user_id."%' OR
          EXISTS (SELECT * FROM wallcomments 
          WHERE wp.p_id = wallcomments.post_id AND wallcomments.tagedpersons LIKE '%".$user_id."%')
)
GROUP BY wp.p_id
ORDER BY cdate DESC

テーブル構造 - INNER JOIN ウォールコメント wc ON wc.post_id = wp.p_id

CREATE TABLE IF NOT EXISTS `wallposts` (
  `p_id` int(11) NOT NULL AUTO_INCREMENT,
  `post` text NOT NULL,
  `type` varchar(55) NOT NULL,
  `value` int(11) NOT NULL,
  `date_created` int(11) NOT NULL,
  `userid` varchar(255) NOT NULL,
  `posted_by` int(11) NOT NULL,
  `likes` int(11) NOT NULL,
  `media` int(11) NOT NULL,
  `uip` varchar(222) NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `url` text NOT NULL,
  `cur_image` text NOT NULL,
  `post_type` tinyint(1) NOT NULL,
  `youtube` text NOT NULL,
  `tagedpersons` varchar(255) NOT NULL,
  `course` int(255) NOT NULL DEFAULT '0',
  `ctimespent` varchar(255) NOT NULL,
  PRIMARY KEY (`p_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=537 ;

CREATE TABLE IF NOT EXISTS `wallcomments` (
  `c_id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) NOT NULL,
  `comments` text NOT NULL,
  `date_created` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  `clikes` int(11) NOT NULL,
  `uip` varchar(222) NOT NULL,
  `tagedpersons` varchar(255) NOT NULL,
  `deleted` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`c_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=349 ;

サンプルデータ:

wp.​​date_created および wc.date_created (フォーマット) - 1356008534

4

3 に答える 3

0

date_createdは INT ですが、これは SQL サーバーで日付としてキャスト可能であると想定していますか?

CAST両方ともDATE、例えば:

CAST(wp.date_created AS DATE) > CAST(MAX(wc.date_created AS DATE))

そう

CASE WHEN CAST(max(wc.date_created) AS DATE) > CAST(wp.date_created AS DATE) THEN CAST(max(wc.date_created) AS DATE) ELSE CAST(wp.date_created AS DATE) END AS cdate
于 2013-01-07T10:27:21.253 に答える
0

きれいにして、これをスカラー関数に入れます

CASE WHEN max(wc.date_created) > wp.date_created THEN max(wc.date_created) ELSE wp.date_created END AS cdate

になる

dbo.ReturnDate(wp.p_id) which returns a date for you

次に、関数でクエリを実行して最大日付を取得できます

返却日には次のようなものを含めることができます

CREATE FUNCTION dbo.ReturnDate(@pid int)
RETURNS date

DECLARE @ReturnDate date, @AnotherDate date
SET @ReturnDate  = (SELECT wp.date_created FROM WallPosts wp WHERE wp.p_id = @pid)
SET @AnotherDate = (SELECT MAX(wc.date_created) FROM WallComments wc WHERE p_id = @pid)

IF @AnotherDate > @ReturnDate
SET @ReturnDate = @AnotherDate

RETURN @ReturnDate

構文をチェックしていないことに注意してください

于 2013-01-07T10:18:37.883 に答える
0

並べ替え、素晴らしい作品.....

コメント テーブルの LEFT JOIN がキーであり、変更も加えられました

CASE WHEN max(wc.date_created) > wp.date_created THEN max(wc.date_created) ELSE wp.date_created END AS cdate

greatest(max(wp.date_created), COALESCE(max(wc.date_created),0)) AS cdate

最後のクエリは次のとおりです。

SELECT DISTINCT wp.p_id, wp.type, wp.value, wp.media, wp.youtube, wp.post_type, wp.tagedpersons, wp.title AS thetitle, wp.url, wp.description, wp.cur_image, wp.uip, wp.likes, wp.userid, wp.posted_by, wp.post AS postdata, wu . * , UNIX_TIMESTAMP( ) - wp.date_created AS TimeSpent, wp.date_created, COALESCE(max(wc.date_created),0), wp.course, 
greatest(max(wp.date_created), COALESCE(max(wc.date_created),0)) AS cdate
FROM wallposts wp
INNER JOIN wallusers wu ON wu.mem_id = wp.userid
LEFT JOIN wallcomments wc ON wc.post_id = wp.p_id
WHERE (
          wp.userid IN (".$matches.") OR 
          (wp.userid IN (".$courses.") AND wp.course = 1)  OR 
          wp.userid =".$user_id." OR
          wp.tagedpersons LIKE '%".$user_id."%' OR
          EXISTS (SELECT * FROM wallcomments 
          WHERE wp.p_id = wallcomments.post_id AND wallcomments.tagedpersons LIKE '%".$user_id."%' AND deleted = 0)
)
GROUP BY wp.p_id
ORDER BY cdate DESC
于 2013-01-07T11:36:56.473 に答える