Heim >Datenbank >MySQL-Tutorial >Wie kann man Tabellen mit LIMIT 1 in einer verbundenen Tabelle effizient verbinden?

Wie kann man Tabellen mit LIMIT 1 in einer verbundenen Tabelle effizient verbinden?

Linda Hamilton
Linda HamiltonOriginal
2024-11-15 21:05:02676Durchsuche

How to Efficiently Join Tables with LIMIT 1 on a Joined Table?

Effizientes Verbinden von Tabellen mit LIMIT 1 auf einer verbundenen Tabelle

Problem:

Zwei Tabellen verbinden und dabei nur eine abrufen Datensatz aus der verbundenen Tabelle für jeden Datensatz in der Primärtabelle, insbesondere in Kontexten, in denen mehrere Datensätze in der verbundenen Tabelle vorhanden sind Tabelle.

LÖSUNG MIT EINER UNTERABFRAGE:

Dieser Ansatz umgeht effektiv den Fehler, der auftritt, wenn mehrere Spalten aus der verknüpften Tabelle ausgewählt werden, während die Ergebnisse auf einen einzelnen Datensatz beschränkt werden. Der Schlüssel besteht darin, eine Unterabfrage zu verwenden, um den Primärschlüssel des gewünschten Datensatzes abzurufen. Die Unterabfrage wird dann verwendet, um die verbundene Tabelle in der primären Abfrage zu filtern.

SELECT
c.id,
c.title,
p.id AS product_id,
p.title AS product_title
FROM categories AS c
JOIN products AS p ON
p.id = (                                 --- the PRIMARY KEY
SELECT p1.id FROM products AS p1
WHERE c.id=p1.category_id
ORDER BY p1.id LIMIT 1
)

Diese Abfrage zeigt eine überlegene Leistung, selbst wenn die verbundene Tabelle eine deutlich größere Anzahl von Datensätzen enthält als die primäre Tabelle.

Alternative Ansätze:

Während der Unterabfrageansatz im Allgemeinen optimal ist, stehen alternative Methoden zur Verfügung. Es ist jedoch wichtig, ihre möglichen Auswirkungen auf die Leistung zu berücksichtigen.

  • Verwendung von GROUP BY und Array-Aggregation (LIMIT NICHT anwendbar):
SELECT
  id,
  category_title,
  (array_agg(product_title))[1]  
FROM
    (SELECT c.id, c.title AS category_title, p.id AS product_id, p.title AS product_title
    FROM categories AS c
    JOIN products AS p ON c.id = p.category_id
    ORDER BY c.id ASC) AS a 
GROUP BY id, category_title;
  • Verwenden von CROSS JOIN und ROW_NUMBER (LIMIT NICHT Anwendbar):
SELECT
  c.id,
  c.title,
  p.id AS product_id,
  p.title AS product_title
FROM categories AS c
CROSS JOIN (SELECT product_id, title, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id) AS rn
            FROM products) AS p
WHERE rn = 1;

Das obige ist der detaillierte Inhalt vonWie kann man Tabellen mit LIMIT 1 in einer verbundenen Tabelle effizient verbinden?. 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