Schnaps: mySQL und count bestimmter Abfrage Teile

Hallo

Meine überschrift ist bestimmt etwas blöd, aber ich wußte es nicht bessrer zusammen zu fassen.

Also, ich habe einen mysql der immer dynamisch generiert wird.

Schaut zum Beispiel so aus.

$sql="SELECT * from bacteria WHERE domain='Bacteria' and (reich='Crenarchaeota' or reich='Aquificae' or reich='Euryarchaeota' or reich='Firmicutes' or reich='Bacteroidetes' )"

kann also schon mal etwas länger werden.

Was ich nun gerne hatte, ist das die Anzahl der Elemente die durch die jeweiligen WHERE Klauseln gefiltert werden bei der Abrage auch mit raus kommen.

Also ich bekomme mit dieser Abfrage ja Zeilen der Tabelle die domain='Bacteria' haben und reich='Crenarchaeota'.....
Ich wüßte einfach gerne wieviele Crenarchaeota in der Abfrage drin sind.

und das ganze soll dynamisch geschehen, es kann also sein das erheblich mehr Filter gesetzt sind.

Hoffe es ist zu verstehen was ich meine.

Gruß
Schnaps

  1. Hallo,

    $sql="SELECT * from bacteria WHERE domain='Bacteria' and (reich='Crenarchaeota' or reich='Aquificae' or reich='Euryarchaeota' or reich='Firmicutes' or reich='Bacteroidetes' )"

    Also ich bekomme mit dieser Abfrage ja Zeilen der Tabelle die domain='Bacteria' haben und reich='Crenarchaeota'.....
    Ich wüßte einfach gerne wieviele Crenarchaeota in der Abfrage drin sind.

    Das wird nicht in einer Abfrage gehen. Allerdings musst Du das Resultset ja sowieso mit einer serverseitigen Programmiersprache auswerten. Das wäre eine Aufgabe für diese. Lass die Abfrage sich nach reich sortieren (ORDER BY reich), dann stehen alle gleichartigen reich untereinander. Bei der Auswertung, in der Schleife, welche die Datensätze ausgibt, erhöhst Du dann einen Zähler von 0 solange um jeweils 1, wie reich im Datensatz gleich bleibt. Wenn reich sich ändert, hast Du dann die Anzahl der Datensätze des vorherigen reich, gibst diese aus und setzt den Zähler wieder auf 0.

    viele Grüße

    Axel

    1. Hui super sind beides sehr interessante Ansätze, das werde ich gleich mal ausprobieren.

      vielen Dank euch beiden das ihr euch meinem Chaos angenommen habt.

      Gruß
      Schnaps

  2. yo,

    $sql="SELECT * from bacteria WHERE domain='Bacteria' and (reich='Crenarchaeota' or reich='Aquificae' or reich='Euryarchaeota' or reich='Firmicutes' or reich='Bacteroidetes' )"

    kann also schon mal etwas länger werden.

    besser ist weil kürzer und übersichtlicher:

    reich IN ('Crenarchaeota', 'Aquificae', 'Euryarchaeota' ....)

    Also ich bekomme mit dieser Abfrage ja Zeilen der Tabelle die domain='Bacteria' haben und reich='Crenarchaeota'.....
    Ich wüßte einfach gerne wieviele Crenarchaeota in der Abfrage drin sind.

    je nachdem wie sich deine tabelle dynamisch aufbaut, könnte man eventuell die anzahl der domain-werte weglassen, da sie zumindestens in diesem falle durch die AND verknüpfung gleich der anzahl aller gefundenen datensätze ist. unterschiedliche anzahl der werte sollten sich also nur noch in der spalte reich befinden. am besten ist dafür die GROUP BY klausel geeignet.

    SELECT domain, reich COUNT(*) AS Anzahl
    FROM bacteria
    WHERE domain='Bacteria'
    AND reich IN ('Crenarchaeota', 'Aquificae', 'Euryarchaeota', 'Firmicutes', 'Bacteroidetes')
    GROUP BY domain, reich

    Ilja

    1. je nachdem wie sich deine tabelle dynamisch aufbaut, könnte man eventuell die anzahl der domain-werte weglassen, da sie zumindestens in diesem falle durch die AND verknüpfung gleich der anzahl aller gefundenen datensätze ist.

      das ist aber nciht immer so, kann auch sein das einer nur nach verschiedenen Reichen abfragt, dann können auch verschiedene Domänen raus kommen, dann ist die Anzahl einer Domain nicht undebingt die Anzahl aller Abfrageergebnisse.

      unterschiedliche anzahl der werte sollten sich also nur noch in der spalte reich befinden. am besten ist dafür die GROUP BY klausel geeignet.

      SELECT domain, reich COUNT(*) AS Anzahl
      FROM bacteria
      WHERE domain='Bacteria'
      AND reich IN ('Crenarchaeota', 'Aquificae', 'Euryarchaeota', 'Firmicutes', 'Bacteroidetes')
      GROUP BY domain, reich

      werde das aber trotzdem mal durchdenken, hoffe das ich eine Lösung dafür finde

      1. yo,

        das ist aber nciht immer so, kann auch sein das einer nur nach verschiedenen Reichen abfragt, dann können auch verschiedene Domänen raus kommen, dann ist die Anzahl einer Domain nicht unbedingt die Anzahl aller Abfrageergebnisse.

        die abfrage würde nur in der WHERE Klausel ein wnig anders aussehen:

        WHERE domain IN (wert1, wert2....) AND reich IN (wert1, wert2....)

        je nachdem welche anzahl du bekommen willst, spielt das keine rolle, da ja eh über domain und reich gruppiert wird. deswetieren stehen die aggregat-funktionen wie COUNT() zur verfügung, die sich auch in einer groupierung einbauen lassen.

        wenn dein dbms unterabfragen kann, so hat man weitere möglichkeiten, falls das GROUP BY nicht ganz das gewünschte ergebnis bringt.

        Ilja