Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [MySQL] Vereinfachung einer Abfrage mit Subquery (https://www.delphipraxis.net/93302-%5Bmysql%5D-vereinfachung-einer-abfrage-mit-subquery.html)

3_of_8 4. Jun 2007 02:32

Datenbank: MySQL • Zugriff über: PHP-MySQL-Extension

[MySQL] Vereinfachung einer Abfrage mit Subquery
 
Morgen.

Ich habe zwei Tabellen, ni_categories und ni_articles, sie stehen in der Relation 1:n.

Ich will jetzt in der Spalte ni_categories.articles die Anzahl der Zeilen in ni_articles mit ni_articles.catid=ni_categories.catid speichern.

Momentan sieht mein Query so aus:
SQL-Code:
UPDATE ni_categories c SET c.articles=(SELECT COUNT(a.articleid) FROM ni_articles a WHERE a.catid=c.catid)
Kann man das auch einfacher machen?

DeddyH 4. Jun 2007 09:23

Re: [MySQL] Vereinfachung einer Abfrage mit Subquery
 
Zitat:

Zitat von 3_of_8
Ich will jetzt in der Spalte ni_categories.articles die Anzahl der Zeilen in ni_articles mit ni_articles.catid=ni_categories.catid speichern.

Ööhmmm... wozu? Auf jeden Fall wüsste ich nicht, wie man das Statement vereinfachen könnte (wieso eigentlich? Ist doch recht kurz und knapp).

3_of_8 4. Jun 2007 11:01

Re: [MySQL] Vereinfachung einer Abfrage mit Subquery
 
Ich hätte gemeint, man könnte den Subquery irgendwie durch eine GROUP BY-Klausel ersetzen, aber wenn es ohne den Subquery nicht geht, ist das auch kein Problem.

Der_Unwissende 4. Jun 2007 11:25

Re: [MySQL] Vereinfachung einer Abfrage mit Subquery
 
Zitat:

Zitat von 3_of_8
Ich hätte gemeint, man könnte den Subquery irgendwie durch eine GROUP BY-Klausel ersetzen, aber wenn es ohne den Subquery nicht geht, ist das auch kein Problem.

Hi,
ich würde Dir hier zustimmen, dass eine Unterabfrage das ganze vielleicht schneller machen könnte. Sicher bin ich mir nicht, kommt wohl unter anderem auf die Anfrageoptimierung an, aber so an sich könnte man die Selektion in eine verschachtelte Anfrage überführen, wobei die innere Anfrage nicht mit der äußeren korreliert. Damit sollte die innere Anfrage einmalig ausgeführt werden und das könnte (wie gesagt, bin nicht sicher) viel effizienter ablaufen als die unverschachtelte Anfrage. Da sollte man einfach mal testen, was schneller läuft.
Was ich meine ist etwas in der Richtung:

SQL-Code:
UPDATE ni_categories c
SET c.articles = SELECT ac.articleCount
FROM (SELECT a.catid, COUNT(a.articleid) as articleCount
      FROM ni_articles a
      GROUP BY a.catid) ac
WHERE ac.catid = c.catid
Hier sollte (wenn ich mich nicht irre) die innere Abfrage nur einmalig ausgeführt werden und die Selektionen auf deren Auswertung geht dann recht flink. Im Einzeiler würde im Worst-Case ein kompletter Durchlauf für jede catid nötig sein, so was dann zu einer deutlich höheren Laufzeit führt (wenn die Datenmenge groß genug ist).
Ich denke mal, Du meintest auch etwas in der Richtung?

Gruß Der Unwissende

3_of_8 4. Jun 2007 11:41

Re: [MySQL] Vereinfachung einer Abfrage mit Subquery
 
Sieht gut aus. Ich hätte gedacht, man könnte das ganze mit JOINs und einem GROUP BY auch ohne Subqueries machen, aber muss ja nicht sein. Ich probier das mal aus.

EDIT:
Ich hab mal die erste Unterabfrage rausgenommen und es funktioniert. Nur eben, wie genau weiß ich nicht.

SQL-Code:
UPDATE ni_categories c,
(
  SELECT a.catid, COUNT( a.articleid ) AS articleCount
  FROM ni_articles a
  GROUP BY a.catid
)ac
SET c.articles = ac.articleCount WHERE ac.catid = c.catid


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz