Mysql query: Select with joining first or default

Viewed 193

I have 2 tables. Persons and Images.

One person may have many images.
I want to select a person with his primary image BUT(!), if none of the images marked as isPrimary=1 bring the first one. Only one or less images may be isPrimary=1

SELECT
  *,
  (
    SELECT id 
    FROM Image 
    WHERES personId=r.id AND isPrimary=1  
    LIMIT 1
  ) AS primaryImageId
FROM Persons r 
ORDER BY id DESC;

I did it with subselect, join is also good... Thanks

1 Answers

You can use:

SELECT r.*,
       (SELECT i.id
        FROM Image i
        WHERES i.personId = r.id 
        ORDER BY i.isPrimary DESC, i.id ASC
        LIMIT 1
       ) AS primaryImageId
FROM Persons r
ORDER BY id DESC;

This orders the images, with the primary one first -- and then takes the first image.

You should learn to qualify all column references -- this is especially important when using correlated subqueries. I assume that the alias r makes sense on the persons table in your native language. Otherwise, use something sensible such as p.

Related