Ankündigung

Einklappen
Keine Ankündigung bisher.

MYSQL Abfrage mit 0

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MYSQL Abfrage mit 0

    Hallo liebe PHP'ler,

    ich sitze momentan an einem MYSQl - Query Problem.
    Im Grunde habe ich eine Datenbank mit den Tabellen: Zimmer, Regal, Buch.
    Der Tabellen Aufbau ist wie folgt:

    Tabelle Zimmer:

    Code:
     
    ID | Name
    --------------------
     1  | Wohnzimmer
     2  | Gästezimmer
     3  | Schlafzimmer
    Tabelle Regal:
    Code:
    ID | Name| Typ|ZimmerID(key)
    --------------------
     1  | Rotes Regal    | Holzregal    |1
     2  | Schwarzes Regal   | Holzregal    |1
     3  | Grünes Regal | Stahlregal |3
     4  | Blaues Regal  | Plastikregal |2

    Tabelle Buch:
    Code:
    ID | Name|RegalID(key)
    --------------------
     1  | Buch1   | 1
     2  | Buch2 |  3 
     3  | Buch3  | 2
    So nun würde ich gerne eine Abfrage erstellen, die mir sagt wie viele Regale der Typen Holzregal, Plastikregal, Stahlregal in den jeweiligen Zimmern stehen, also wie folgt:

    Code:
     
    Typ       |       Wohnzimmer | Gästezimmer | Schlafzimmer
    ----------------------------------------------------------
    Plastikregal |     0           |       1       |      0
    Holzregal    |     2           |       0       |      0
    Stahlregal   |     0           |       0       |      1
    Ich habe mittlerweile schon alles Probiert was mir einfällt aber komme zu keinem richtigen Ergebniss.
    Wenn jemand einen Idee hat, würde ich mich riesig freuen.

    Vielen Dank im Voraus


  • #2
    Ich glaube nicht, dass du schon alles probiert hast. Und wenn doch, hast du zumindest vergessen es zu posten.

    In dem Bereich sind meine SQL-Kentnisse nicht gerade überragend, ich würde ein Sub-Select machen:
    Code:
    SELECT
      regal_id,
      COUNT(buch_id)
    FROM regal
    INNER JOIN buch USING(regal_id)
    GROUP BY regal_id
    Somit hast du zu jedem Regal die Anzahl Bücher. Das einmal als Ansatz.
    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

    Kommentar


    • #3
      Im speziellen nennt sich das Pivot Abfrage was du vor hast.

      Kommentar


      • #4
        Zitat von erc Beitrag anzeigen
        Im speziellen nennt sich das Pivot Abfrage was du vor hast.
        Und geht so:

        Code:
        test=*# select typ, sum(case when zimmer.id=1 then 1 else 0 end) as wohnzimmer, sum(case when zimmer.id=2 then 1else 0 end) as gästezimmer, sum(case when zimmer.id=3 then 1 else 0 end) as schlafzimmer from regal left join zimmer on regal.zimmer=zimmer.id group by typ;
             typ      | wohnzimmer | gästezimmer | schlafzimmer
        --------------+------------+-------------+--------------
         plastikregal |          0 |           1 |            0
         stahlregal   |          0 |           0 |            1
         holzregal    |          2 |           0 |            0
        (3 rows)
        Hab ich aber hier und anderswo schon tausend mal gezeigt.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Vielen Dank für eure Antworten

          habe gerade versucht, deinen Code
          Code:
          test=*# select typ, sum(case when zimmer.id=1 then 1 else 0 end) as wohnzimmer, sum(case when zimmer.id=2 then 1else 0 end) as gästezimmer, sum(case when zimmer.id=3 then 1 else 0 end) as schlafzimmer from regal left join zimmer on regal.zimmer=zimmer.id group by typ;
          bei mir zu implementieren, leider erzeugt dies einen Fehler:
          PHP-Code:
           1066 Not unique table/alias'zimmer' 
          Ich verstehe das Ende der Anweisung leider nicht so recht, wieso kommt bei dem Join:
          Code:
          zimmer on regal.zimmer=zimmer.id group
          Würde mich sehr freuen, wenn du mir das kurz erklären könntest

          Kommentar


          • #6
            So gerade noch rumprobiert, und peinlicher weise lag es an einem Zahlendreher -.-
            Leider stimmt die Ausgabe dennoch noch nicht ganz, meine Ausgabe sieht nun so aus:
            Code:
               
            typ      | wohnzimmer | gästezimmer | schlafzimmer
            --------------+------------+-------------+--------------
             plastikregal |          1 |           1 |            1
             stahlregal   |          1 |           1 |            1
             holzregal    |          2 |           2 |            2
            Es ist als ob er einen wert jeweils für alle nimmt...
            Weis hier eventuell jemand an was das liegen könnte ??

            Kommentar


            • #7
              Zitat von weswesx Beitrag anzeigen
              Leider stimmt die Ausgabe dennoch noch nicht ganz, meine Ausgabe sieht nun so aus:

              Es ist als ob er einen wert jeweils für alle nimmt...
              Weis hier eventuell jemand an was das liegen könnte ??
              Offensichtlich weil Du nicht das machst, was ich Dir gezeigt habe.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Google hilft auch hier um zu verstehen, wie es geht:

                http://www.boynux.com/creating-pivot-reports-in-mysql/

                Einfach und verständlich...
                ... just be good!

                Kommentar


                • #9
                  Genial ich komme aus dem Urlaub wieder und es funktioniert, VIELEN DANK!!
                  Nun sitze ich leider vor dem nächsten Problem in der gleichen Abfrage..

                  Ich habe der Tabelle Zimmer ein weiteres Attribut namens Status hinzugefügt, in welchem entweder Frei,Belegt,nicht verfügbar steht.

                  Nun würde ich gerne meine vorherige Abfrage noch filtern, dass ich am ende z.B nur diese bekomme wo der Status Belegt ist oder z.B Aktiv usw.

                  Als erstes hatte ich mir das in etwa so gedacht:

                  Code:
                   select typ, sum(case when zimmer.id=1 then 1 else 0 end) as wohnzimmer, sum(case when zimmer.id=2 then 1else 0 end) as gästezimmer, sum(case when zimmer.id=3 then 1 else 0 end) as schlafzimmer from regal left join zimmer on regal.zimmer=zimmer.id WHERE Zimmer.Status = 'Aktiv' group by typ;
                  Aber ich glaube da bin ich auf dem falschen Dampfer

                  Weis hier jemand eventuell was ich falsch mache ?

                  Kommentar


                  • #10
                    Was stimmt den deiner Meinung nach nicht? Was erwartest du für ein Ergebnis, was bekommst du?

                    *edit* ach alles klar, mach mal aus dem WHERE ein AND. Du machst mit der WHERE Klausel aus dem LEFT JOIN ein INNER JOIN, daher muss die Bedingung ins ON.

                    Kommentar


                    • #11
                      Leider bekomme ich auch mit AND, immer die Fehlermeldung das die Column "Status " nicht bekannt ist..
                      Oder muss ich hier eventuell nochmal einen Join verwenden ?

                      Kommentar


                      • #12
                        left join zimmer on ... WHERE Zimmer.Status = 'Aktiv'
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          PHP-Code:

                          select
                              typ
                          ,
                              
                          sum(case 
                                  
                          when zimmer.id=1 then 1 
                                  
                          else 
                              end
                          ) as wohnzimmer,
                              
                          sum(case 
                                  
                          when zimmer.id=2 then 1else 
                              end
                          ) as gästezimmer,
                              
                          sum(case 
                                  
                          when zimmer.id=3 then 1 
                                  
                          else 
                              end
                          ) as schlafzimmer 
                          from
                              regal 
                          left join
                              zimmer 
                                  on regal
                          .zimmer=zimmer.id 
                          WHERE
                              Zimmer
                          .Status 'Aktiv' 
                          group by
                              typ

                          Mal formatiert.
                          http://www.freeformatter.com/sql-formatter.html

                          Dein Tabellenname ist anders.
                          edit: nvm.
                          Relax, you're doing fine.
                          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                          Kommentar


                          • #14
                            Leider bekomme ich hier die Fehlermeldung:
                            Code:
                            unknow Column regal.zimmer
                            .. abe rich kann mir nicht erklären warum ??

                            Kommentar


                            • #15
                              Im Ausgangspost heißt die Spalte ZimmerID
                              Relax, you're doing fine.
                              RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                              Kommentar

                              Lädt...
                              X