please use here and copy the code in below to add context to my questions.
As you see, I have a table and within it certain Father’s have the same name, I want to choose the father
that has the most dogs
for my final list. You can see the entire table in Query #1
, my desired result in Query #2
with respect to Father's
returned, but when I am trying to get Father John
in Query #3
to only return 1 time but it shows the entire record for Father John with 9 dogs and 10 dogs.
How can I get Query #3
to select only one Father whom has the Max Dogs, and return the rest of the columns as well?
Create tables code:
CREATE TABLE IF NOT EXISTS `table_3` ( `id` int(6) unsigned NOT NULL, `Father` varchar(200) NOT NULL, `Dogs` varchar(200) NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `table_3` (`id`,`Father`, `Dogs`) VALUES ('1', 'John', '10'), ('2', 'John','9'), ('3', 'Joe', '4'), ('4', 'Jeremy', '4'), ('5', 'Jack', '4'), ('6', 'NULL', '5');
Query #1
select Father from table_3;
Query #1 OUTPUT:
id Father Dogs 1 John 10 2 John 9 3 Joe 4 4 Jeremy 4 5 Jack 4 6 NULL 5
Query #2
select b.Father from (select Father, max(Dogs) from table_3 group by 1 )b;
Query #2 OUTPUT
Father Jack Jeremy Joe John NULL
Query #3
select * from table_3 a where a.Father in ( select b.Father from (select Father, max(Dogs) from table_3 group by 1 )b);
Query #3 Output
id Father Dogs 1 John 10 2 John 9 3 Joe 4 4 Jeremy 4 5 Jack 4 6 NULL 5
Desired Output from Query #3
id Father Dogs 1 John 10 3 Joe 4 4 Jeremy 4 5 Jack 4 6 NULL 5
Advertisement
Answer
Try this –
SELECT * FROM table_3 A INNER JOIN( SELECT father,MAX(Dogs) Dogs -- You need to CAST your Dogs column to INT before you apply MAX on this column FROM table_3 GROUP BY Father )B ON A.father = B.father AND A.Dogs = B.Dogs
You can also try with row number if your database permits as below-
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY father ORDER BY Dogs DESC) RN FROM table_3 ) A WHERE RN = 1