I have looked for quite some time for an answer to this. It seems like it should be simple but I'm not sure it is ...
SETUP:
A database has two tables: my_contacts and my_sales.
Each contact can have one or more sales. Each sale has a creation date and can be open or closed.
CHALLENGE:
I want to generate a single query to return a joined results set which has only one record for each contact as follows:
- If there are any open sales for the contact, return the sale that was most recently created.
- If there are no open sales, return the sale that was most recently created.
I tried sorting by is_open, create_date_time and then grouping by contact_id - but Group By states that it chooses its records before any sorting takes place so it doesn't work.
DATABASE DETAILS:
CREATE TABLE `my_contacts` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `my_sales` (
`id` INT NOT NULL AUTO_INCREMENT,
`contact_id` INT(11) NOT NULL,
`description` VARCHAR(45) NOT NULL,
`is_open` INT(1) NOT NULL,
`create_date_time` DATETIME NOT NULL,
PRIMARY KEY (`id`));
INSERT INTO `my_contacts` (`name`) VALUES ('Jim');
INSERT INTO `my_contacts` (`name`) VALUES ('Jane');
INSERT INTO `my_contacts` (`name`) VALUES ('Roger');
INSERT INTO `my_contacts` (`name`) VALUES ('Alice');
INSERT INTO `my_sales` VALUES (NULL, '2', 'Books', '0', '2017-09-06');
INSERT INTO `my_sales` VALUES (NULL, '3', 'Toys', '0', '2017-06-21');
INSERT INTO `my_sales` VALUES (NULL, '2', 'Groceries', '1', '2017-05-06');
INSERT INTO `my_sales` VALUES (NULL, '1', 'Water', '0', '2016-09-21');
INSERT INTO `my_sales` VALUES (NULL, '4', 'Toys', '1', '2017-04-04');
INSERT INTO `my_sales` VALUES (NULL, '3', 'Food', '1', '2017-05-06');
INSERT INTO `my_sales` VALUES (NULL, '2', 'Water', '1', '2017-04-07');
INSERT INTO `my_sales` VALUES (NULL, '4', 'Food', '1', '2017-01-02');
INSERT INTO `my_sales` VALUES (NULL, '1', 'Food', '0', '2017-07-09');
RESULT:
The query would join the two tables and yield the following result:
id contact_id description is_open create_date_time id name
9 1 Food 0 7/9/2017 0:00 1 Jim
3 2 Groceries 1 5/6/2017 0:00 2 Jane
6 3 Food 1 5/6/2017 0:00 3 Roger
5 4 Toys 1 4/4/2017 0:00 4 Alice