MySQL首次出现后忽略NULL结果

时间:2014-03-14 11:43:25

标签: mysql sql

我在MySQL数据库中有一个表lastviewed

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 ;

我需要通过当前[登录] ORDER BY lastviewed DESC LIMIT 4过滤此表的最后4行user_id,这不是什么大不了的事,但是有一些新要求我被卡住了

我跟踪过案件。

  1. 如果NULL已经有另一行(在上次查看的前4个条目中,因为只显示了前4个),请不要显示record product行记录(即record_id列有值)。
  2. 仅当NULL在上次查看的前4行之一中没有值为product的其他行时才显示record_id行,因为只显示了前4行。< / LI>
  3. 如果同一product有两行,三行或四行,并且所有行都显示不同的record_id
  4. 目前我有这个查询

    SELECT * FROM `lastviewed` WHERE `user_id` = xxx 
    ORDER BY `lastviewed` DESC LIMIT 4
    

    我知道我们需要一些子查询和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
    

    必填结果

    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
    

    使用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
    

    小提琴: http://sqlfiddle.com/#!2/3e20e/2/0

1 个答案:

答案 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;