Sven: mySQL: Ergebnisse zweier Spalten zu einer Spalte verbinden?

Hallo ihr,

ich habe Nicknames in 2 unterschiedlichen Spalten, die ich wie folgt abrufe:

(SELECT id,id\_to,nick\_to,id\_from,nick\_from
 FROM db.table
 WHERE id\_from = '1' AND recycled\_from = '1' AND deleted\_from != '1')

UNION

(SELECT id,id\_to,nick\_to,id\_from,nick\_from
 FROM db.table
 WHERE id\_to = '1' AND recycled\_to = '1' AND deleted\_to != '1')

Die Ergebnisse der Spalten nick\_to und nick\_from würde ich nun gern zu einer Spalte zusammenfassen, damit ich vernünftig danach sortieren kann. Es ist NICHT nötig, die Spalten danach wieder zu trennen... in diesem speziellen Fall können die ruhig als eine Spalte behandelt werden.

Gibt es da eine Möglichkeit mit MySQL? Ich könnte natürlich per PHP einfach beide Spalten in das gleiche Array einlesen lassen, aber vielleicht gibts ja direkt eine Lösung?

Lg
Sven

  1. Hi Sven!

    Gibt es da eine Möglichkeit mit MySQL? Ich könnte natürlich per PHP einfach beide Spalten in das gleiche Array einlesen lassen, aber vielleicht gibts ja direkt eine Lösung?

    Folgendes sollte funktionieren:
    SELECT id,id_to,id_from, (nick_to+nick_from) as nick
    ...

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. echo $begrüßung;

      Folgendes sollte funktionieren:
      SELECT id,id_to,id_from, (nick_to+nick_from) as nick

      Nein, im Gegensatz zu einigen Programmiersprachen lassen sich Strings unter SQL im Allgemeinen nicht addieren. SELECT 'foo' + 'bar' ergibt unter MySQL 0. Zum Stringverbinden gibt es die Funktion CONCAT().

      Ich glaube aber nicht, dass das die gewünschte Lösung ist. Ich glaube nur, dass ich das Anliegen des OP nicht direkt verstanden habe. Ein paar Beispieldaten könnten aufklärend sein.

      echo "$verabschiedung $name";

      1. hi,

        Folgendes sollte funktionieren:
        SELECT id,id_to,id_from, (nick_to+nick_from) as nick

        Nein, im Gegensatz zu einigen Programmiersprachen lassen sich Strings unter SQL im Allgemeinen nicht addieren. SELECT 'foo' + 'bar' ergibt unter MySQL 0.

        Zumindest werden Werte aus Zahlenfeldern addiert :-)

        --Hotte

      2. Hi dedlfix!

        Folgendes sollte funktionieren:
        SELECT id,id_to,id_from, (nick_to+nick_from) as nick
        Nein, im Gegensatz zu einigen Programmiersprachen lassen sich Strings unter SQL im Allgemeinen nicht addieren. SELECT 'foo' + 'bar' ergibt unter MySQL 0. Zum Stringverbinden gibt es die Funktion CONCAT().

        Ich dachte, MySQL orientiert sich am T-SQL-Standard?
        Verketten von Zeichenfolgen

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. echo $begrüßung;

          Ich dachte, MySQL orientiert sich am T-SQL-Standard? Verketten von Zeichenfolgen

          Das wäre mir neu, dass es das (generell, außer vielleicht in einzelnen Details) tun würde. Auch Oracle beschwert sich mit "invalid number", wenn man zwei Strings addiert, die sich nicht als Zahl lesen lassen. Ich machte daraufhin noch einen Versuch mit SELECT '1' + '2' in Oracle und in MySQL und erhielt als Ergebnis jeweils 3. T-SQL hingegen ergab 12.

          echo "$verabschiedung $name";

          1. Hi dedlfix!

            Das wäre mir neu, dass es das (generell, außer vielleicht in einzelnen Details) tun würde. Auch Oracle beschwert sich mit "invalid number", wenn man zwei Strings addiert, die sich nicht als Zahl lesen lassen. Ich machte daraufhin noch einen Versuch mit SELECT '1' + '2' in Oracle und in MySQL und erhielt als Ergebnis jeweils 3. T-SQL hingegen ergab 12.

            Das wusste ich noch gar nicht. =)
            Danke!

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Hi,

    Die Ergebnisse der Spalten nick\_to und nick\_from würde ich nun gern zu einer Spalte zusammenfassen, damit ich vernünftig danach sortieren kann.

    Lies Dich mal in joins ein, damit löst man solche Probleme ohne zuviel Performance zu verlieren.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
  3. hi,

    CONCAT() ist Deine Funktion zum Verketten, geht auch mit unterschiedlichen Feldtypen:

    SELECT CONCAT(url,  cnt)  as nick
    FROM counter

    url VARCHER
    cnt INTEGER

    --Hotte

    1. Hallo,

      CONCAT() ist Deine Funktion zum Verketten, geht auch mit unterschiedlichen Feldtypen:

      SELECT CONCAT(url,  cnt)  as nick
      FROM counter

      Leider nicht. Mit concat werden die Ergebnismengen zusammengefasst.

      Spalte A  Spalte B
      abc   def

      Wenn ich jetzt mache: SELECT CONCAT(a,b) as ab  und mir das Ergebnis ausgeben lasse, lautet das so:

      abcdef

      Ich möchte als Ergebnismenge aber:
      abc
      def

      So als wären die Mengen der Spalte B direkt in die Spalte A geschrieben. Hab ich bis jetzt leider nicht hinbekommen...

      Lg
      Sven

      1. Hallo,

        CONCAT() ist Deine Funktion zum Verketten, geht auch mit unterschiedlichen Feldtypen:

        SELECT CONCAT(url,  cnt)  as nick
        FROM counter

        Leider nicht. Mit concat werden die Ergebnismengen zusammengefasst.

        Spalte A  Spalte B
        abc   def

        Wenn ich jetzt mache: SELECT CONCAT(a,b) as ab  und mir das Ergebnis ausgeben lasse, lautet das so:

        abcdef

        Ich möchte als Ergebnismenge aber:
        abc
        def

        Zeilenumbruch einbauen? Geht so:

        SELECT CONCAT(url, "\n", cnt)
        FROM counter

        Dann stehts untereinander.

        Viele Grüße,
        Hotte

      2. echo $begrüßung;

        Wenn ich jetzt mache: SELECT CONCAT(a,b) as ab  und mir das Ergebnis ausgeben lasse, lautet das so:

        abcdef

        Ich möchte als Ergebnismenge aber:
        abc
        def

        So als wären die Mengen der Spalte B direkt in die Spalte A geschrieben. Hab ich bis jetzt leider nicht hinbekommen...

        Hatte ich doch recht vermutet. Man kann bei einer Abfrage keine Ergebniszeilen zusätzlich generieren als schon Datenzeilen vorhanden sind. Entweder zwei Abfragen starten und mit UNION verbinden, was du ja schon begonnen hast. Nur solltest du dabei nick_from und nick_to in die selbe Ergebnisspalte bringen und nicht in unterschiedliche. Z.B. so:

        (SELECT id, nick_from FROM ...)
          UNION
          (SELECT id, nick_to FROM ...)
          ORDER BY 2    [*]

        Alternativ kannst du mit Joins arbeiten, wobei du allerdings genau die Join-Bedingung festlegen musst, damit sich nicht alles mit jedem verbindet (was ein kartesisches[**] Produkt ergäbe).

        [*] Spaltennummer verwenden oder der 2. Spalte ein Alias verpassen und das verwenden.
        [**] nach Rene Descartes, nicht nach Karthago, deswegen ohne h

        echo "$verabschiedung $name";