3Danke
ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
320
320
EMPFEHLEN
-
28.12.11 23:58 #1
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:
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14
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?=)
-
MySQL? Oracle? MS SQL?
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
29.12.11 14:35 #3
Hi sorry war ein bisschen spät. Es ist ein MySQL-Server
=)
-
Moin VanHellsehn,
auf das Feld "num" im Subselect kannst du zugreifen, wenn du ALLE Felder in einem äußeren SELECT abgreifst,
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13
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
Code sql:1 2 3 4 5 6 7 8 9 10
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
Code sql:1 2 3
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
Code sql:1 2 3 4
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)
Ähnliche Themen
-
Javascript Wert an PHP Funtion weiter geben
Von live4music im Forum Javascript & AjaxAntworten: 3Letzter Beitrag: 03.07.11, 14:46 -
Javascript Wert an php weiter geben
Von live4music im Forum Javascript & AjaxAntworten: 0Letzter Beitrag: 01.07.11, 12:54 -
wie verwende ich ByReference
Von Hamzter im Forum VisualStudio & MFCAntworten: 0Letzter Beitrag: 15.12.07, 15:29 -
JAXB Unmarshalling: Wie verwende ich null als default Wert?
Von janw im Forum JavaAntworten: 0Letzter Beitrag: 16.11.06, 10:56 -
Wie verwende ich XSLT? Ein Anwendungsbeispiel
Von Thomas Darimont im Forum XML TechnologienAntworten: 2Letzter Beitrag: 01.12.04, 23:32





Zitieren


Login





