Wie verwende ich Wert weiter?

VanHellsehn

Erfahrenes Mitglied
Hi Leute,
ich war gerade an einer relativ einfachen Abfrage dran.
Und war möchte ein von einer Tabelle X alle Zeilen auslesen dessen Fremdschlüssel in einer anderen Tabelle verwendet wird.
Das zählen habe ich auch im nichts hin bekommen doch habe ich nun ein Problem mit dieser einfachen Bedingung.

Hier mein bisheriges Ergebnis:
SQL:
	SELECT
		categories.*
		,(
			SELECT
				COUNT(*)
			FROM
				entries
			WHERE
				entries.categories_ID = categories.ID
		) AS num
	FROM
		categories
	WHERE
		num > 0

Nur wird mir immer als Fehler angezeigt das Num nicht existiert.
Wie kann ich dann eine Bedingung mit diesem Wert erstellen?
 
Moin VanHellsehn,

auf das Feld "num" im Subselect kannst du zugreifen, wenn du ALLE Felder in einem äußeren SELECT abgreifst,

SQL:
SELECT * FROM (
SELECT
        categories.*
        ,(
            SELECT  COUNT(*) 
            FROM
                entries
            WHERE
                entries.categories_ID = categories.ID
        ) AS num
    FROM categories
) x
WHERE num > 0;

Anmerkung: der von mir zusätzliche Alias "x" in der vorletzten Zeile ist eigentlich überflüssig.
Einige SQL-Parser bestehen allerdings darauf, dass jedes SELECT .... FROM (...) nach der Klammer einen ALIAS bekommt.

Grüße
Biber
 
Nachtrag:

die obige Abfrage tut zwar, was sie soll - sieht aber doch sehr geschraubt aus.

Ich würde es eher umformulieren in
SQL:
SELECT
        categories.*, num
    FROM categories, 
      (  SELECT categories_id,  COUNT(*) as num 
            FROM  entries
           GROUP BY  categories_ID
        ) AS usedcatIDs

WHERE categories.ID = usedcatIDs.categories_id;

Das ist erstens wesentlich näher an einer Übersetzung des abgefragten Sachverhalts dran ("Liste mir alle wirklich verwendeten Kategorien mit ihrer Häufigkeit auf") und zweitens brauchst du nichts mehr auf "WHERE num > 0" einschränken.

Grüße
Biber
 
Falls du das COUNT(*) nur für die Bedingung brauchst, wäre das hier wohl sinnvoller

SQL:
SELECT			*
FROM			categories
WHERE			EXISTS(SELECT 1 FROM entries WHERE categories_ID = categories.ID)

Oder wenn du es brauchst, wäre ein JOIN wesentlich besser als ein subselect

SQL:
SELECT			categories.*, COUNT(*)
FROM			categories
JOIN			(entries) ON (entries.categories_ID = categories.ID)
GROUP BY		categories.ID

(funktioniert so nur in MySQL, z.B. nicht bei Oracle)
 

Neue Beiträge

Zurück