Ankündigung

Einklappen
Keine Ankündigung bisher.

3 Reihen in eine darstellen

Einklappen

Neue Werbung 2019

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

  • 3 Reihen in eine darstellen

    Hi,

    vereinfachte Anfrage:

    Ich mache eine SELECT Abfrage wo ich 3 Zeilen zurückbekommen.

    Z.B.
    Code:
    ID	VALUE
    1	Wert-1
    2	Wert-2
    3	Wert-3
    Ist es mit irgendeiner SQL Syntax möglich, das ich diese 3 Reihen in eine "verfrachten" kann ? ggf. mit den AS befehl
    Es müßten also neue nicht vorhandene Spalten erzeugt werden.

    Code:
    ID	Value-1		Value-2		Value-3
    1	Wert-1		Wert-2		Wert-3


  • #2
    Und diese Frage sinnvoll beantworten zu können, lieferst du wieder mal viel zu wenig relevante Infos ...


    Per Subselect kannst du dir bspw. einen „Spaltenwert“ mittels Abfrage eines anderen Wertes erzeugen.

    Kommentar


    • #3
      Im Prinzip ist sowas Aufgabe eines JOINs. Nur die Kriterien fehlen in Deiner Aussage.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Zitat von ChrisB Beitrag anzeigen
        Und diese Frage sinnvoll beantworten zu können, lieferst du wieder mal viel zu wenig relevante Infos ...
        Das Problem ist, das wenn ich das Problem genau Poste, das viele geistlich austeigen, weil zu kompliziert.

        Aber machen wir mal die Probe auf exempel.

        Ich baue mir EIN SQL Statement zusammen, was alle benötigten Daten beinhaltet.

        Hier jetzt erstmal der Code, wie er einwandfrei funktioniert:
        Code:
        SELECT T1.`sld`,T1.`tld`,T1.`land`,T1.`zuordnung`,T1.`flagge`, 
               T2.`period` AS Laufzeit, T2.value AS Preis, T2.aktion,
               T3.`value` AS Klausel
        
        FROM domain_definition AS T1, 
             tbl_cctlds AS T2,
             tbl_cond AS T3
        
        WHERE (T1.tld = T2.tld) AND (T1.tld = T3.tld)
        
          AND T1.`zuordnung` = 'Europa' 
          AND T2.`aktion`= 'Renew'
        
        GROUP BY `tld`
        ORDER BY `tld`
        LIMIT 30
        
        
        Output 1 Zeile:
        sld 	tld 	land 		zuordnung 	flagge 			Laufzeit 	Preis 	aktion 	Klausel
          	al 	Albanien 	Europa 		flag_albania.gif 	24 		14900 	Renew 	3, 4
        in der T2.aktion gibt es aber 3 Werte, die ich benötige.
        Also dachte ich mir, das folgender Code klappt.... tut er auch.. nur bekomme ich WEIT aus mehr an Rückantworten als vorhanden (benötigt)

        Code:
        SELECT T1.`sld`,T1.`tld`,T1.`land`,T1.`zuordnung`,T1.`flagge`, 
               T2.`period` AS Laufzeit, T2.value AS Preis, T2.aktion,
               T3.`value` AS Klausel
        
        FROM domain_definition AS T1, 
             tbl_cctlds AS T2,
             tbl_cond AS T3
        
        WHERE (T1.tld = T2.tld) AND (T1.tld = T3.tld)
        
          AND T1.`zuordnung` = 'Europa' 
          AND T2.`aktion` IN ('Renew', 'Create', 'Transfer')
        
        GROUP BY `tld`
        ORDER BY `tld`
        LIMIT 30
        Den Output für den 2ten Code spare ich mir hier.
        Lasse ich GROUP BY drin erhalte ich wie oben nur eine Zeile zurück. Hier ist mir noch nicht ganz klar, nach was SQL hier geht, da ich entweder mal Renew Create oder Transfer zurückbekommen.

        Nehme ich GROUP BY raus, wird aus der oben genannten Zeile > 30 Zeilen.

        Ich erwarte eine von den 2 Möglichkeiten von SQL zurück.
        Rot markierte sind von mir manuell eingetragen... nur Fraglich, wie ich diese per SQL erreiche.

        Möglichkeit 1: => die bevorzugte mit 3 "virtuelle Spalten"
        Code:
        sld 	tld 	land 		zuordnung 	flagge 			Laufzeit 	Preis-renew 	Preis-create 	Preise-transfer	Klausel
          	al 	Albanien 	Europa 		flag_albania.gif 	24 		14900 		14900		14900	 	3, 4
        Möglichkeit 2 => würde ich aber nur ungern verwenden
        Code:
        sld 	tld 	land 		zuordnung 	flagge 			Laufzeit 	Preis 	aktion 	Klausel
          	al 	Albanien 	Europa 		flag_albania.gif 	24 		14900 	Renew 	3, 4
          	al 	Albanien 	Europa 		flag_albania.gif 	24 		14900 	Create	3, 4
          	al 	Albanien 	Europa 		flag_albania.gif 	24 		14900 	Transfer3, 4

        Kommentar


        • #5
          Zitat von noop Beitrag anzeigen
          Das Problem ist, das wenn ich das Problem genau Poste, das viele geistlich austeigen, weil zu kompliziert.
          Das könnte auch bedeuten, dass du schlicht und einfach zu viel von deiner Arbeit ins Forum „outsourced“, und das offenbar ziemlich regelmäßig.

          Aber machen wir mal die Probe auf exempel.
          Da fehlen immer noch Beispieldaten und das mit denen erwarte exakte Ergebnis.
          (Und wenn schon Beispieldaten, dann bietet es sich an, die in Form von INSERT-Statements zu posten, zusammen mit den CREATE TABLE-Statements - dann kann wer will das nämlich bequem per Copy&Paste testen.)


          Lasse ich GROUP BY drin erhalte ich wie oben nur eine Zeile zurück. Hier ist mir noch nicht ganz klar, nach was SQL hier geht, da ich entweder mal Renew Create oder Transfer zurückbekommen.
          MySQL geht hier nach „Fehler tolerieren“.

          Nach reinem SQL ist es nämlich gar nicht erlaubt, Spalten auszulesen, die nicht Bestandteil der Gruppierung sind.

          Dafür, dass MySQL allerdings diesen Fehler im Aufbau deiner Query toleriert, gibt es dann absolut keine Garantie dafür, welchen Wert von mehreren möglichen du zurück bekommst.

          Kommentar


          • #6
            Ach ich depp.

            GROUP BY T2.aktion

            und schon bekomme ich Möglichkeit 2 zurück. Naja... machmal sieht man den Wald...etc.

            Aber nochmal zurück zu Möglichkeit 1:
            Das geht garnicht ?

            Vorhandene Spalte + Zeile: aktion => create
            Verknüpft mit einer virtuellen Spalte aktion-create

            Vorhandene Spalte + Zeile: aktion => transfer
            Verknüpft mit einer virtuellen Spalte aktion-transfer
            etc. ???

            Kommentar


            • #7
              Habe doch oben geschrieben - das geht mit nem JOIN, wenn es ein geeignetes JOIN-Kriterium gibt. Normal macht das aber niemand so, sondern wertet in PHP aus.

              virtuellen Spalte
              Bitte gleich abgewöhnen. Sowas gibt nicht. Es gibt „Spalten einer Ergebnismenge“, wobei nicht alle Spalten Werten aus den beteiligten Tabellen entsprechen müssen.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Habe doch oben geschrieben - das geht mit nem JOIN, wenn es ein geeignetes JOIN-Kriterium gibt.
                Oh... stimmt. Muß ich wohl übersehen haben.

                Zitat von nikosch Beitrag anzeigen
                Normal macht das aber niemand so, sondern wertet in PHP aus.
                .
                Wohl eher deswegen, weil JOIN ein nicht wirklich beliebter Befehl ist.
                Ich mag den aufgrund seiner komplexilität auch nicht wirklich.

                Warum sollte mir SQL eine 2te (oder mehr) Spalte(n) zurückliefern, wo immer nur eine Spalte einen geänderten Inhalt drin hat. Verursacht mehr Zeilen + mehr Speicher im array + kostet Performanz.

                Dummerweise komme ich an JOIN auch nicht ran... trotz etlichen Beispielen:
                Schau dir hier doch mal das einfache Beispiel nummer 2 an:
                Fortgeschrittene Jointechniken: Mehrere Tabellen mit JOIN verknüpfen - gleiche Joinspalten

                Hier wird ja schon Join eingesetzt. Allerdings ist die Ausgabe nicht so wie ich mir das nun vorstelle.
                In dem Beispiel würde ich dann auch eine 2te Zeile bevorzugen, weil ja nur eine Spalte identische Werte hat... aber wie müßte denn die Syntax lauten, damit man aus diesen 2 Zeilen eine macht ?

                Kommentar


                • #9
                  Vielleicht bist du mit GROUP_CONCAT erst mal besser bedient, wenn die anderen Möglichkeiten noch zu komplex für dich sind.

                  Damit könntest du alle drei Werte in einer Spalte bekommen; Auseinandernehmen wäre dann hinterher bei der Auswertung im Script angesagt.

                  Kommentar


                  • #10
                    Warum sollte mir SQL eine 2te (oder mehr) Spalte(n) zurückliefern, wo immer nur eine Spalte einen geänderten Inhalt drin hat. Verursacht mehr Zeilen + mehr Speicher im array + kostet Performanz.
                    Das ist aber völlig normal. Alternativ könntest Du die Zeilen
                    1 Wert-1
                    2 Wert-2
                    3 Wert-3
                    in einer zweiten Query auslesen.

                    Ich mag den aufgrund seiner komplexilität auch nicht wirklich.
                    JOINs sind absolute Basics. Ohne wirst Du nicht weit kommen.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Vielleicht bist du mit GROUP_CONCAT erst mal besser bedient, wenn die anderen Möglichkeiten noch zu komplex für dich sind.
                      Hey... super Vorschlag.
                      Liefert zwar nicht das, wie ich es wollt... ließ mich aber über einen ähnlichen Befehl stolpern:

                      Code:
                      group_concat(DISTINCT T2.value,':', T2.aktion separator ', ') AS Preis,
                      ...
                      AND T2.`aktion` IN ('Renew', 'Create', 'Transfer')
                      
                      
                      Output:
                      7000:Create, 7000:Renew, 7000:Transfer
                      Und das kann man ja dann mit PHP auseinandernehmen

                      Kommentar


                      • #12
                        Nun brauche ich doch nochmal n Denkanstoß... is glaube ich schon zu spät, um noch brauchbare Ideen aus den Hirn zu laden

                        Die Hauptabfrage ist fertig. Nun brauch ich aber noch den Inhalt von einer 2ten Spalte. Der Aufbau ist ähnlich.... sind aber nicht 100% gleich
                        Verbunden sind diese wie alle Tabellen anhand von 'tld'.

                        Erst dachte ich, das das hier klappen könnte.
                        Allerdings wird T4 als neue Spalte angezeigt als die vorhanden Spalten zu nutzen.
                        Code:
                        SELECT T1.`sld`,T1.`tld`,T1.`land`,T1.`zuordnung`,T1.`flagge`, T1.`eigener_VK_Renew`, 
                               T2.`period` AS Laufzeit, group_concat(DISTINCT T2.value,':', T2.aktion separator ', ') AS EKPreis,
                               T3.`value` AS Klausel,
                               T4.`sld`,T4.`tld`,T4.`eigener_VK_Renew`
                        
                        
                        FROM domain_definition AS T1, 
                             tbl_cctlds        AS T2,
                             tbl_cond          AS T3,
                             domain_definition_SUB         AS T4
                        
                        WHERE (T1.tld = T2.tld) AND (T1.tld = T3.tld) AND (T1.tld = T4.tld)
                        
                          AND T1.`zuordnung` = 'Top 10'
                          AND T2.`aktion` IN ('Renew', 'Create', 'Transfer')
                        
                        
                        GROUP BY T1.`tld`
                        ORDER BY T1.`tld`

                        Also müßte UNION mir helfen. Problem hierbei ist aber wieder, das ich falsche Werte rausbekomme.... und der Output, der VOR UNION aufgeführt sind, weden auf einmal garnicht mehr angezeigt.

                        Code:
                        SELECT T1.`sld`,T1.`tld`,T1.`land`,T1.`zuordnung`,T1.`flagge`, T1.`eigener_VK_Renew`, 
                               T2.`period` AS Laufzeit, group_concat(DISTINCT T2.value,':', T2.aktion separator ', ') AS EKPreis,
                               T3.`value` AS Klausel
                        
                        FROM domain_definition AS T1, 
                             tbl_cctlds        AS T2,
                             tbl_cond          AS T3,
                             domain_definition_SUB         AS T4
                        
                        WHERE (T1.tld = T2.tld) AND (T1.tld = T3.tld) AND (T1.tld = T4.tld)
                        
                          AND T1.`zuordnung` = 'Europa'
                          AND T2.`aktion` IN ('Renew', 'Create', 'Transfer')
                        
                        GROUP BY T1.`tld`
                        
                        
                        UNION ALL
                        
                        SELECT 
                               T4.`sld`,T4.`tld`,null,T1.`zuordnung`,null, T4.`eigener_VK_Renew`, 
                               T5.`period` AS Laufzeit, group_concat(DISTINCT T5.value,':', T5.aktion separator ', ') AS EKPreis,
                               null
                        
                        FROM domain_definition     AS T1,
                             domain_definition_SUB AS T4, 
                             tbl_gtlds             AS T5
                        
                        WHERE (T4.tld = T1.tld) AND (T5.tld = T1.tld)
                        
                          AND T1.`zuordnung` = 'Europa'
                          AND T5.`aktion` IN ('Renew', 'Create', 'Transfer')
                        Frage: Ist UNION hier überhaupt der korrekte Befehl ?

                        Im oberen Bereich werden schon gewisse Spalten erzeugt. Diese sollen genutzt werden, da diese 100%tig identisch sind. 2 Spalten gibt es nicht = aber die habe ich schon mit null ausgefüllt.

                        Wo hab ich mein Denkfehler ?

                        Kommentar


                        • #13
                          Zitat von noop Beitrag anzeigen
                          Wo hab ich mein Denkfehler ?
                          Du nimmst immer noch an, wir wüssten genauso viel über die Problemstellung wie du.
                          Tun wir aber nicht - und deshalb reicht es auch nicht aus, ein paar Queries zu posten und zu schreiben, die müssten eigentlich tun was ich will - tun sie aber nicht.

                          Kommentar


                          • #14
                            Oki.... setzen wir erstmal wo anders an. Vllt. kann ich daran aufbauen.

                            Ich möchte Tabelle 1 abfragen wo ich die WHERE Bedingung aus einer anderen Tabelle fülle. Hier bekomme ich aber mehrer Werte zurück, wo SQL natürlich rüber meckert:

                            Subquery returns more than 1 row

                            Code:
                            SELECT sld, `tld`, vk_preis  FROM `domain_definition_SUB` 
                            WHERE ( 
                            SELECT `tld` FROM `domain_definition` WHERE `zuordnung` = 'Europa')
                            Läßt sich das irgendwie beheben ?

                            Kommentar


                            • #15
                              Zitat von noop Beitrag anzeigen
                              Läßt sich das irgendwie beheben ?
                              Natürlich - durch Verwendung eines Vergleichsoperators, der auch mit mehreren Werten umgehen kann.

                              Kommentar

                              Lädt...
                              X