我lastviewed
在MySQL数据库中有一个表,
CREATE TABLE `lastviewed` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`record_id` int(11),
`product_id` int(11) NOT NULL DEFAULT '0',
`user_id` int(11) NOT NULL,
`lastviewed` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Run Code Online (Sandbox Code Playgroud)
我需要ORDER BY lastviewed DESC LIMIT 4
通过当前[登录]过滤这个表的最后4行,这user_id
不是什么大不了的事,但是有一些新要求我被困住了
我有以下情况.
NULL
record
如果product
已经有另一行(在最后一次查看的前4个条目中,因为只显示了前4个)并且有记录(即record_id
列具有值),请不要显示该行.NULL
仅当在product
上record_id
一次查看的前4行之一中没有其他行时才显示该行,因为只显示了前4行.product
并且所有行都有不同的record_id
显示所有行.目前我有这个查询
SELECT * FROM `lastviewed` WHERE `user_id` = xxx
ORDER BY `lastviewed` DESC LIMIT 4
Run Code Online (Sandbox Code Playgroud)
我知道我们需要一些子查询和IF/ELSE CASE/THEN条件,但我没有提示如何实现它.
样本数据
id record_id product_id user_id lastviewed
261766 145304 95650 266 2014-03-14 03:34:16
261594 NULL 95650 266 2014-03-14 02:47:38
261765 145303 91312 266 2014-03-14 01:57:26
261444 NULL 91312 266 2014-03-14 01:44:33
261778 145314 91312 266 2014-03-10 23:02:39
261777 NULL 91312 266 2014-03-10 23:02:13
261776 145313 91312 266 2014-03-10 23:00:26
261775 NULL 91312 266 2014-03-10 22:59:13
261774 NULL 93185 266 2014-03-10 22:57:16
261773 NULL 93185 266 2014-03-10 22:53:47
Run Code Online (Sandbox Code Playgroud)
并且要求的结果
261766 145304 95650 266 2014-03-14 03:34:16
261765 145303 91312 266 2014-03-14 01:57:26
261778 145314 91312 266 2014-03-10 23:02:39
261776 145313 91312 266 2014-03-10 23:00:26
261774 NULL 93185 266 2014-03-10 22:57:16
Run Code Online (Sandbox Code Playgroud)
随着 LIMIT 4
261766 145304 95650 266 2014-03-14 03:34:16
261765 145303 91312 266 2014-03-14 01:57:26
261778 145314 91312 266 2014-03-10 23:02:39
261776 145313 91312 266 2014-03-10 23:00:26
Run Code Online (Sandbox Code Playgroud)
小提琴: http ://sqlfiddle.com/#!2/3e20e/2/0
小智 1
我希望它对您有所帮助并满足您的期望。
SELECT * FROM
(SELECT * FROM `lastviewed` WHERE `user_id` = 266 AND record_id IS NOT NULL
UNION
SELECT * FROM `lastviewed` WHERE product_id NOT IN
(SELECT product_id FROM `lastviewed` WHERE record_id IS NOT NULL GROUP BY product_id)
) AS q1
GROUP BY product_id, record_id
ORDER BY `lastviewed` DESC
LIMIT 4;
Run Code Online (Sandbox Code Playgroud)