Heim >Datenbank >MySQL-Tutorial >Wie kann man mithilfe von SQL-Joins effizient Benutzer mit mehreren Tags finden?

Wie kann man mithilfe von SQL-Joins effizient Benutzer mit mehreren Tags finden?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-23 17:30:14878Durchsuche

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

SQL zum Anwenden von Bedingungen auf mehrere Zeilen in einem Join

Problem:

Ermitteln Sie Benutzer, die sowohl „tag1“ als auch „tag1“ besitzen. und „tag2“-Tags, während der Effekt der Verwendung von „IN“ vermieden wird, der Benutzer mit beiden zurückgibt Tag.

Lösung:

Um Zeilen aus Tabelle A basierend auf zwei Zeilenbedingungen in Tabelle B auszuwählen, wählen Sie eine dieser Strategien:

1. Testen verschiedener Zeilen:

  • EXISTS-Klausel:Überprüft die Existenz von Zeilen in Tabelle B, die den Bedingungen entsprechen.
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')
  • Unterabfragen: Übereinstimmungen basierend auf Zeilen in der Tabelle 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') 
  • JOINs: Aggregiert Zeilen durch mehrmalige Verknüpfung mit Tabelle B.
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. Zeilen aggregieren:

  • COUNTs: Geeignet, wenn Tabelle B vor doppelten Tags schützt.
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
  • String-Verarbeitung (nicht Standard-SQL): Verkettet Tags zu einem String und prüft, ob bestimmte Tags vorhanden sind Tags.
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 

Empfehlung:

Für eine optimale Skalierbarkeit sollten Sie die Verwendung von COUNTs mit geschützten Tags oder innerer Aggregation in Betracht ziehen, wenn für einen Benutzer mehrere Tags angezeigt werden können.

Das obige ist der detaillierte Inhalt vonWie kann man mithilfe von SQL-Joins effizient Benutzer mit mehreren Tags finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn