MySQL首次出现后忽略NULL结果

zzl*_*ani 6 mysql sql

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不是什么大不了的事,但是有一些新要求我被困住了

我有以下情况.

  1. NULL record如果product已经有另一行(在最后一次查看的前4个条目中,因为只显示了前4个)并且有记录(即record_id列具有值),请不要显示该行.
  2. NULL仅当在productrecord_id一次查看的前4行之一中没有其他行时才显示该行,因为只显示了前4行.
  3. 如果有相同的两行,三行或四行,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)