Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL Ignore NULL results after first occurrence

Tags:

sql

mysql

I have a table lastviewed in MySQL database,

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 ;

I need to get last 4 rows ORDER BY lastviewed DESC LIMIT 4 of this table filtered by current [logged-in] user_id and this is not the big deal, But there are some new requirements where I'm stuck

I've following cases.

  1. DON'T show the NULL record row if that product already has another row (in the first 4 entries of last viewed. because only the first 4 are shown) with a record (i.e. record_id column has a value).
  2. Show the NULL row only if the product does not have another row with a value record_id in one of the first 4 rows of the last viewed because only first 4 shown.
  3. If there are two, three or four rows for the same product and all rows have different record_id show all of them.

Currently I've this query

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

I know we required some sub queries and IF/ELSE CASE/THEN conditions, but I've NO HINT how to achieve it.

Sample Data

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

And the required result

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

With the 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

Fiddle: http://sqlfiddle.com/#!2/3e20e/2/0

like image 981
zzlalani Avatar asked Mar 14 '14 11:03

zzlalani


People also ask

How do I stop NULL values in MySQL?

Example - With SELECT Statement Here is an example of how to use the MySQL IS NOT NULL condition in a SELECT statement: SELECT * FROM contacts WHERE last_name IS NOT NULL; This MySQL IS NOT NULL example will return all records from the contacts table where the last_name does not contain a null value.

Does Group by clause ignore NULL values in MySQL?

Aggregate (group) functions such as COUNT() , MIN() , and SUM() ignore NULL values. The exception to this is COUNT(*) , which counts rows and not individual column values. For example, the following statement produces two counts.

How do I show only NOT NULL values in SQL?

To display records without NULL in a column, use the operator IS NOT NULL. You only need the name of the column (or an expression) and the operator IS NOT NULL (in our example, the price IS NOT NULL ). Put this condition in the WHERE clause (in our example, WHERE price IS NOT NULL ), which filters rows.


1 Answers

I hope it helps and meets your expectations.

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;
like image 112
mca Avatar answered Sep 16 '22 14:09

mca