我在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
,这不是什么大不了的事,但是有一些新要求我被卡住了
我跟踪过案件。
NULL
已经有另一行(在上次查看的前4个条目中,因为只显示了前4个),请不要显示record
product
行记录(即record_id
列有值)。NULL
在上次查看的前4行之一中没有值为product
的其他行时才显示record_id
行,因为只显示了前4行。< / LI>
product
有两行,三行或四行,并且所有行都显示不同的record_id
。目前我有这个查询
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
答案 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;