Home >Database >Mysql Tutorial >How to Efficiently Find Users with Multiple Tags Using SQL Joins?
Problem:
Determine users who possess both 'tag1' and 'tag2' tags while avoiding the effect of using 'IN,' which returns users with either tag.
Solution:
To select rows from table A based on two row conditions in table B, choose one of these strategies:
1. Testing Different Rows:
SELECT * FROM users WHERE EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag1') AND EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag2')
SELECT * FROM users WHERE id IN (SELECT user_id FROM tags WHERE name ='tag1') AND id IN (SELECT user_id FROM tags WHERE name ='tag2')
SELECT u.* FROM users u INNER JOIN tags t1 ON u.id = t1.user_id INNER JOIN tags t2 ON u.id = t2.user_id WHERE t1.name = 'tag1' AND t2.name = 'tag2'
2. Aggregating Rows:
SELECT users.id, users.user_name FROM users INNER JOIN tags ON users.id = tags.user_id WHERE tags.name IN ('tag1', 'tag2') GROUP BY users.id, users.user_name HAVING COUNT(*) = 2
SELECT user.id, users.user_name, GROUP_CONCAT(tags.name) as all_tags FROM users INNER JOIN tags ON users.id = tags.user_id GROUP BY users.id, users.user_name HAVING FIND_IN_SET('tag1', all_tags) > 0 AND FIND_IN_SET('tag2', all_tags) > 0
Recommendation:
For optimal scalability, consider using COUNTs with protected tags or inner aggregation if multiple tags can appear for a user.
The above is the detailed content of How to Efficiently Find Users with Multiple Tags Using SQL Joins?. For more information, please follow other related articles on the PHP Chinese website!