問題:
確定同時擁有「tag1」的用戶和'tag2' 標籤,同時避免使用'IN'的影響,這會回傳有以下任一內容的使用者
解決方案:
要根據表B 中的兩個行條件從表A 中選擇行,請選擇下列策略之一:
1。測試不同的行:
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'
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
2.聚合行:
計數: 如果表 B 防止重複標籤,則適用。 字串處理(非標準 SQL): 將標籤連接成字串並檢查特定標籤的存在。 建議:為了獲得最佳可擴展性,如果可以出現多個標籤,請考慮使用帶有受保護標籤或內部聚合的COUNT對於使用者。以上是如何使用SQL連線高效尋找具有多個標籤的使用者?的詳細內容。更多資訊請關注PHP中文網其他相關文章!