2

I have a bit of an issue with the following query.

SELECT su.display_name, su.user_email, sm.meta_value FROM system_users AS su
JOIN system_usermeta AS sm ON su.ID = sm.user_id
WHERE sm.meta_key = 'market';

The above query works fine to show all users and their values who have 'market' set in the meta_key column.

But how can I turn this around? How could I show all the users which don't have the meta_key 'market' associated with their user_ID.

Kaii
  • 20,122
  • 3
  • 38
  • 60
Marcel
  • 49
  • 4

6 Answers6

1

Try this:

SELECT su.display_name, su.user_email, sm.meta_value FROM system_users AS su
JOIN system_usermeta AS sm ON su.ID = sm.user_id
WHERE sm.meta_key <> 'market';
Thanos Markou
  • 2,587
  • 3
  • 25
  • 32
1

I think you need a more complex query for this . . . because you are checking multiple rows. Aggregation is one approach:

SELECT su.display_name, su.user_email
FROM system_users su JOIN
     system_usermeta sm
     ON su.ID = sm.user_id
GROUP BY su.display_name, su.user_email
HAVING SUM( sm.meta_key = 'market' ) = 0;
Gordon Linoff
  • 1,242,037
  • 58
  • 646
  • 786
1

I suggest you to use LEFT JOIN because you want to add a filter in the left table and show data from right table, so try this:

SELECT su.display_name, su.user_email, sm.meta_value 
FROM system_users AS su
LEFT JOIN system_usermeta AS sm ON su.ID = sm.user_id
      AND sm.meta_key <> 'market';

If you want to filter users that haven't any meta_key with 'market' try this:

SELECT su.display_name, su.user_email, sm.meta_value 
FROM system_users AS su
LEFT JOIN system_usermeta AS sm ON su.ID = sm.user_id
WHERE NOT EXISTS(
    SELECT 1 
    FROM system_usermeta smi
    WHERE su.ID = smi.user_id AND smi.meta_key = 'market')
shA.t
  • 16,580
  • 5
  • 54
  • 111
0

If you want to check whether sm.meta_key is not 'market', then you can use Thanos Markou's solution

SELECT su.display_name, su.user_email, sm.meta_value FROM system_users AS su
JOIN system_usermeta AS sm ON su.ID = sm.user_id
WHERE sm.meta_key <> 'market';

or, if you want to check that sm.meta_key does not contain 'market', then this is how you can do it:

SELECT su.display_name, su.user_email, sm.meta_value FROM system_users AS su
JOIN system_usermeta AS sm ON su.ID = sm.user_id
WHERE sm.meta_key not like '%market%';

If it might be 'Market', then you can make the text lower case to have a case-insensitive check.

Lajos Arpad
  • 64,414
  • 37
  • 100
  • 175
0

Is a join clause necessary?

SELECT su.display_name, su.user_email, sm.meta_value FROM system_users AS su,system_usermeta AS sm where su.ID = sm.user_id
AND sm.meta_key <> 'market';
I_am_Batman
  • 895
  • 9
  • 21
  • Apparently, eliminating join doesn't add to any advantage. http://stackoverflow.com/questions/121631/inner-join-vs-where – I_am_Batman Jun 29 '15 at 18:21
-1

Use This

SELECT su.display_name, su.user_email, sm.meta_value FROM system_users AS su
JOIN system_usermeta AS sm ON su.ID = sm.user_id
WHERE sm.meta_key != 'market';
Amrut Gaikwad
  • 524
  • 1
  • 3
  • 19