tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von Biber2
  • 1 Beitrag von Biber2
  • 1 Beitrag von CPoly
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
320
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von VanHellsehn
    VanHellsehn VanHellsehn ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Beiträge
    299
    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?
     
    =)

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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

  3. #3
    Avatar von VanHellsehn
    VanHellsehn VanHellsehn ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Beiträge
    299
    Hi sorry war ein bisschen spät. Es ist ein MySQL-Server
     
    =)

  4. #4
    Biber2 Biber2 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Ort
    Bremen
    Beiträge
    215
    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
    VanHellsehn bedankt sich. 

  5. #5
    Biber2 Biber2 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Ort
    Bremen
    Beiträge
    215
    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
    VanHellsehn bedankt sich. 

  6. #6
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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)
    VanHellsehn bedankt sich. 

Ähnliche Themen

  1. Javascript Wert an PHP Funtion weiter geben
    Von live4music im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 03.07.11, 14:46
  2. Javascript Wert an php weiter geben
    Von live4music im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 01.07.11, 12:54
  3. wie verwende ich ByReference
    Von Hamzter im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 15.12.07, 15:29
  4. Antworten: 0
    Letzter Beitrag: 16.11.06, 10:56
  5. Wie verwende ich XSLT? Ein Anwendungsbeispiel
    Von Thomas Darimont im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 01.12.04, 23:32