简体   繁体   中英

SQL query to select based on many-to-many relationship

This is really a two-part question, but in order not to mix things up, I'll divide into two actual questions. This one is about creating the correct SQL statement for selecting a row based on values in a many-to-many related table:

在此处输入图片说明

Now, the question is: what is the absolute simplest way of getting all resources where eg metadata.category = subject AND where that category's corresponding metadata.value ='introduction'?

I'm sure this could be done in a lot of different ways, but I'm a novice in SQL, so please provide the simplest way possible... (If you could describe briefly what the statement means in plain English that would be great too. I have looked at introductions to SQL, but none of those I have found (for beginners) go into these many-to-many selections.)

The easiest way is to use the EXISTS clause. I'm more familiar with MSSQL but this should be close

SELECT *
FROM resources r
WHERE EXISTS (
    SELECT *
    FROM metadata_resources mr
        INNER JOIN metadata m ON (mr.metadata_id = m.id)
    WHERE mr.resource_id = r.id AND m.category = 'subject' AND m.value = 'introduction'
)

Translated into english it's 'return me all records where this subquery returns one or more rows, without returning the data for those rows'. This sub query is correlated to the outer query by the predicate mr.resource_id = r.id which uses the outer row as the predicate value.

I'm sure you can google around for more examples of the EXIST statement

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM