首頁 >資料庫 >mysql教程 >如何使用SQL連線高效尋找具有多個標籤的使用者?

如何使用SQL連線高效尋找具有多個標籤的使用者?

Patricia Arquette
Patricia Arquette原創
2024-12-23 17:30:14875瀏覽

How to Efficiently Find Users with Multiple Tags Using SQL Joins?

將條件應用於聯結中的多行的SQL

問題:

確定同時擁有「tag1」的用戶和'tag2' 標籤,同時避免使用'IN'的影響,這會回傳有以下任一內容的使用者

解決方案:

要根據表B 中的兩個行條件從表A 中選擇行,請選擇下列策略之一:

1。測試不同的行:

  • EXISTS 子句: 驗證表 B 是否存在符合條件的行。
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')
  • 子查詢: 基於表格中的行進行配對B.
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
  • JOIN:
  • 透過與表B 多次聯結來聚合行。
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn