SQL-Select Abfragen



  • kann man folgende MySQL-Abfragen irgendwie zusammenfassen?

    SELECT COUNT(mes_id) AS cnt FROM tabelle WHERE mem_id='xxx' AND folder='inbox' AND type='1' AND new='new'
    SELECT COUNT(mes_id) AS cnt FROM tabelle WHERE type='2' AND mem_id='xxx'
    SELECT COUNT(mes_id) AS cnt FROM tabelle WHERE type='3' AND mem_id='xxx'
    SELECT COUNT(mes_id) AS cnt FROM tabelle WHERE type='4' AND mem_id='xxx'
    SELECT COUNT(mes_id) AS cnt FROM tabelle WHERE (type='5' OR type='6') AND mem_id='xxx'

    oder gibt es kein drumherum, alles einzeln zu machen? :xmas1:



  • als erstes sieht es so aus, als wenn 2. - 6. Zeile einfach zusammengefasst werden kann:

    SELECT COUNT(mes_id) AS cnt
    FROM   tabelle
    WHERE  type between '2' and '6'
    AND    mem_id='xxx'
    

    oder

    SELECT COUNT(mes_id) AS cnt
    FROM   tabelle
    WHERE  mem_id='xxx'
    AND    type in ( '2', '3', '4', '5', '6' )
    

    mit dem 1. zusammengefasst:

    SELECT COUNT(mes_id) AS cnt
    FROM   tabelle
    WHERE  mem_id='xxx'
    AND    (( type in ( '2', '3', '4', '5', '6' ))
    OR     (type = '1'
    AND    folder = 'inbox'
    AND    new = 'new' ))
    

    ...ohne Gewähr 😃



  • naja COUNT() liefert für jede Abfrage nen anderen Wert, ich bräuchte also eine Abfrage die alle einzelnen COUNT()'s beinhaltet und zurückgeben kann...

    bringt das Erzeugen einer View und die Abfragen auf dieser durchführen etwas?



  • Hmm, eventuell wäre ja sowas ein Ansatz:

    SELECT count(type),type
    WHERE mem_id='xxx'
    GROUP BY type
    

    (wobei - die Bedingungen je nach Typ müsstest du auch nich in's where einordnen)



  • Die Abfragen 2 - 4 kannst du über den In Operator und Group by zusammenfassen.
    Die Abfragen musst du so belassen.
    Wenn ich dich richtig verstanden habe, möchtest du nur ein ResultSet haben. Also einfach zwichen den einzelnen Select's ein Union hinzufügen um die Ergebnisse zusammen zufügen.

    SELECT ...
    UNION
    SELECT ...
    UNION
    SELECT ...



  • select
    count( if(mem_id='xxx' AND folder='inbox' AND type='1' AND new='new',1,0) ) as cnt1,
    count( if(type='2' AND mem_id='xxx',1,0) ) as cnt2,
    count( if(type='3' AND mem_id='xxx',1,0) ) as cnt3,
    count( if(type='4' AND mem_id='xxx',1,0) ) as cnt4,
    count( if((type='5' OR type='6') AND mem_id='xxx',1,0) ) as cnt5
    ;


Anmelden zum Antworten