Re: Can't get my query to return wanted data

"shawn l.green" <[email protected]> Fri, 19 Jan 2018 11:25:42 -0500
Newsgroups gmane.comp.db.mysql.general
Organization Oracle Corporation
Message-ID <[email protected]>
Hello Chris,

On 1/19/2018 12:50 AM, Chris Roy-Smith wrote:
> Hi
> I am running mysql 5.7.20 in ubuntu linux 17.10
>
> I have 2 tables, member and status with contents like
>
> member:
> ident, 	given, 	surname
> 1	fred	jones
> 2	john	howard
> 3	henry	wales
> 4	jenny	brown
>
> status:
> ident	year
> 1	2017
> 2	2017
> 3	2017
> 4	2017
> 1	2018
> 3	2018
>
> I want my query to return the name and ident from the member table for all
> members that has not got an entry in status with year=2018
>
> I have been working on the following query to achieve this, but it only
> returns data when there is no `year` entries for a selected year.
>
> select details.ident, given, surname from details left join status on
> details.ident = status.ident where NOT EXISTS (select year from status
> where (status.year = 2018) and (details.ident = status.ident) )
>
>
> Thank you for looking at this.
> regards, Chris Roy-Smith
>
>

try this...

SELECT
   d.ident, d.given, d.surname
FROM details d
LEFT JOIN (
   SELECT DISTINCT ident
   FROM status
   WHERE year=2018
) s
   ON s.ident = d.ident
WHERE
   s.ident is NULL;

How it works....
#
Start by building a list of unique `ident` values that match the 
condition you do NOT want to find. (you will see why in a moment)

LEFT JOIN that list to your list of members (with your list on the right 
side of the LEFT JOIN).  Where that join's ON condition is satisfied, a 
value for the column s.ident will exist. Where it isn't satisfied, there 
will be a NULL value in s.ident.

Finally, filter the combination of the s and d tables (I'm referring to 
their aliases) to find all the rows where s.ident was not given a value 
because it did not satisfy the ON condition of your outer join.
#

Yours,
-- 
Shawn Green
MySQL Senior Principal Technical Support Engineer
Oracle USA, Inc. - Integrated Cloud Applications & Platform Services
Office: Blountville, TN

Become certified in MySQL! Visit https://www.mysql.com/certification/ 
for details.

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql