3

Why does this sql query only show results if they only have a row in users_warnings?

SELECT 
 u.id, 
 uw.warning 
FROM 
 users u
 INNER JOIN users_warnings uw ON (
  u.id = uw.uID
 )
LIMIT 21

I wish to show all users, but also grab the column "warning" in users_warnings, if any.

Mike Partridge
  • 5,128
  • 8
  • 35
  • 47
Karem
  • 17,615
  • 72
  • 178
  • 278

4 Answers4

6

Because you're using an inner join, which requires a row to exist on the joined table. Try the following:

SELECT 
 u.id, 
 uw.warning 
FROM 
 users u
 LEFT JOIN users_warnings uw ON (
  u.id = uw.uID
 )
LIMIT 21
Mike Partridge
  • 5,128
  • 8
  • 35
  • 47
6

An INNER JOIN only returns something if there is data in both tables.
Try a LEFT JOIN instead:

SELECT u.id, uw.warning FROM users u
            LEFT JOIN users_warnings uw ON (u.id = uw.uID)
            LIMIT 21
Christian Specht
  • 35,843
  • 15
  • 128
  • 182
2

Change your inner join for a left join, as so:

SELECT u.id, uw.warning FROM users u
                LEFT JOIN users_warnings uw ON (u.id = uw.uID)
                LIMIT 21
Icarus
  • 63,293
  • 14
  • 100
  • 115
1
SELECT  
    u.id,  
    IFNULL(uw.warning,'') warning
FROM  
   (SELECT id FROM users LIMIT 21) u 
   LEFT JOIN users_warnings uw
   ON u.id = uw.uID 
;
  • Should be a LEFT JOIN not INNER JOIN
  • Refactored the query to get first 21 users before attempting a JOIN (faster query)
  • Defaulted warning to blank string if user had no warning
RolandoMySQLDBA
  • 43,883
  • 16
  • 91
  • 132