I have a mySQL database which includes 3 tables to associate galleries with images. The images are stored in the table “files” and the galleries in the table “galleries”, so I use a middle table called “gallery_files” for the association between them. The “gallery_files” table consists of the 2 IDs (F_ID, G_ID) of each of the main tables respectively.
The files/images can be associated with more than one gallery, so there can be records in the “gallery_files” of the same F_ID for different G_IDs.
Now, I would like to make a mySQL query which would bring all the images that ARE NOT associated with a given gallery already. So I use the following query:
(let’s say for the gallery with ID: 9)
SELECT * FROM files
INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png')
AND files.F_DELETED = 0
AND gallery_files.G_ID <> 9
My problem is that if there is a record of an image associated with a different gallery it still brings it. I know why this happens, but I cannot think of a smart query to do the job. I know how to solve this by using 2 queries but I would like to avoid it, if possible.
Any thoughts?
Without a subquery, you can use an outer join, and check for NULL columns to only select those rows that don’t match the inner join:
By putting the G_ID condition in the
ONclause, theJOINjoins each file to its gallery-9 row from thegallery_filestable, if that exists, or to NULLs if it doesn’t (since it’s an outer join).Then, by checking for NULL in the gallery_files columns (I checked G_ID, but any column would have worked), we only get those rows from
fileswhich were not in gallery 9.