joehosch: Unterabfrage lieferte mehr als einen Datensatz zurück - was sonst?

Hallo,

Ich habe zwei Tabellen, die ich mit Hilfe einer Dritten verlinkt haben (s.u.)

1 Lieder
2 Veranstaltungen
3 Jointabellle 

Ich möchte in einer Abfrage die Lieder ausgeben und wann sie bereits in einer Veranstaltung gesungen worden sind. Mit

SELECT *
FROM `xlieder`
left join xjvl on xjvl.idl=xlieder.id
where xlieder.id=6
order by xlieder.id

bekomme ich eine Abfrage für Lied nr 6 in der die Datensätze doppelt sind.

id|title|idv|idl 6|eieiDeius|1|6 6|eieiDeius|2|6

ich möchte aber haben:

id|title|idv|idl 6|eieiDeius|1,2|6

ich habe keine Ahnung wie ich das realisieren könnte. (Dabei kann natürlich das Lied auch in Veranstaltung 6,8 usw gesungen worden sein.)

gefunden habe ich auch nur das folgende, das mir aber auch nicht weiter hilft.

Danke für das bereits angeschnittene Problem in

https://forum.selfhtml.org/self/2018/jan/25/mysql-abfrage-ueber-zwei-tabellen-ausgabe-verschiedener-titel-aus-der-tabelle/1712717#m1712717

Meine Datenbank

CREATE TABLE `xlieder` (
  `id` int(11) NOT NULL,
  `title` text COLLATE latin1_german2_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
INSERT INTO `xlieder` (`id`, `title`) VALUES
(1, 'ararwarnd '),
(2, 's s as r d'),
(3, 'r r er r d'),
(4, 'llllallve '),
(5, 'ibibeib bl'),
(6, 'eieiDeius '),
(7, ' F Fe F di'),
(8, ' F Fe F di'),
(10, 'gegerge Mo'),
(11, 'dede deein'),
(12, 'asaswases '),
(13, 'wawa waes,'),
(14, ' k ke kEnd'),
(15, ' g gg gzin'),
(16, 'g,g,ng,etu'),
(17, 'n n In er ');
ALTER TABLE `xlieder`   ADD PRIMARY KEY (`id`);
ALTER TABLE `xlieder`   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=840;
COMMIT;

CREATE TABLE `xveranstaltung` (
  `id` int(11) NOT NULL,
  `datum` date NOT NULL,
  `zeit` time NOT NULL,
  `typ` text COLLATE latin1_german2_ci NOT NULL,
  `titel` text COLLATE latin1_german2_ci NOT NULL,
  `ort` text COLLATE latin1_german2_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
INSERT INTO `xveranstaltung` (`id`, `datum`, `zeit`, `typ`, `titel`, `ort`) VALUES
(1, '2018-09-10', '10:30:00', 'Typ', 'titel', 'Ort'),
(2, '2018-09-20', '10:30:00', 'Typ', 'titel', 'Ort'),
(3, '2018-09-30', '10:30:00', 'Typ', 'titel', 'Ort'),
(4, '2018-10-10', '10:30:00', 'Typ', 'titel', 'Ort');
ALTER TABLE `xveranstaltung`  ADD PRIMARY KEY (`id`);
ALTER TABLE `xveranstaltung`  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
COMMIT;

CREATE TABLE `xjvl` (
CREATE TABLE `xjvl` (
  `idv` int(11) NOT NULL,
  `idl` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
INSERT INTO `xjvl` (`idv`, `idl`) VALUES
(1, 6),
(1, 5),
(1, 3),
(1, 2),
(2, 6),
(2, 3),
(2, 17);
COMMIT;

Schade, dass laut Vorschau die Seite keinen Zeilenumbruch unterstützt, sondern nur einen Absatzumbruch.

  1. Tach!

    Mit [...] bekomme ich eine Abfrage für Lied nr 6 in der die Datensätze doppelt sind.

    id|title|idv|idl 6|eieiDeius|1|6 6|eieiDeius|2|6

    ich möchte aber haben:

    id|title|idv|idl 6|eieiDeius|1,2|6

    ich habe keine Ahnung wie ich das realisieren könnte.

    Eine Möglichkeit ist, über idv zu gruppieren und außerdem darauf die Funktion GROUP_CONCAT() anzuwenden. (Das geht aber so nur in MySQL, weil das bei einem GROUP BY auch zulässt, Spalten zu selektieren, über die nicht gruppiert wurde. Das ist aber in dem Fall nicht weiter tragisch, weil nur vom Join verdoppelte Information entfernt wird. Wenn in den Datensätzen unterschiedliche Information enthalten wäre, gäbe es ein zufälliges Ergebnis aus einem der Datensätze der jeweiligen Gruppe.)

    Schade, dass laut Vorschau die Seite keinen Zeilenumbruch unterstützt, sondern nur einen Absatzumbruch.

    Doch, da geht sogar noch mehr. Ich hab mir erlaubt, Formatierungen einzubringen. Ein Link zur Fpormatierungsübersicht ist über dem Speichern-Button zu finden.

    dedlfix.

    1. Hi dedlfix, danke für die schnelle Antwort. Ich versuche gerade das einzubauen, aber irgendwie habe ich noch eine Knoten in den Gedanken. Ich bekomme immer seltsame Ergebnisse wenn ich Group benutze. Irgendwas habe ich da nicht verstanden. Ich nutze sonst eigentlich keine komplizierteren Abfragen und muss noch mal da nachforschen. Aber auf jeden Fall sehe ich, wie das funktionieren müsste.

      Das mit der Vorschau: Ich habe gesehen, dass es im Beitrag dann doch besser dargestellt wird als in der Vorschau. Habe auch die anderen Sachen gesehen.

      1. Tach!

        Ich versuche gerade das einzubauen, aber irgendwie habe ich noch eine Knoten in den Gedanken. Ich bekomme immer seltsame Ergebnisse wenn ich Group benutze.

        Zwischen WHERE und ORDER BY das GROUP BY idv setzen, und beim Select das GROUP_CONCAT(idv) hinzufügen, müsste es eigentlixh bringen. Ansonsten bitte die Query zeigen, die nicht das gewünschte Ergebnis bringt.

        dedlfix.

        1. Hallo, ich habe

          SELECT *,group_concat(idv)
          FROM `xlieder`
          left join xjvl on xjvl.idl=xlieder.id
          where xlieder.id=6
          group by xjvl.idv
          order by xlieder.id
          

          (xjvl.idv oder idv geht beides nicht) und bekomme

          id|Aufsteigend|1|title|idv|idl|group_concat(idv) 6|eieiDeius|1|6|1 6|eieiDeius|2|6|2

          aber ich habe wohl die falsche Grundabfrage. mit

          SELECT *,GROUP_CONCAT(idv SEPARATOR ",") 
          FROM `xjvl`
          left join xlieder on xlieder.id = xjvl.idl
          GROUP by idv
          

          erhalte ich

          idv|idl|id|title|GROUP_CONCAT(idv SEPARATOR ",") 1|6|6|eieiDeius|1,1,1,1 2|6|6|eieiDeius|2,2,2

          und da müsste eigentlich 1,2 stehen. .Konten im Gehirn:

          Horst

          ich arbeite auf xammp mit folgenden Daten

          Server: 127.0.0.1 via TCP/IP
          Server-Typ: MariaDB
          Server-Version: 10.1.29-MariaDB - mariadb.org binary distribution
          Protokoll-Version: 10
          Benutzer: root@localhost
          Server-Zeichensatz: UTF-8 Unicode (utf8)
          

          Webserver

          Apache/2.4.29 (Win32) OpenSSL/1.1.0g PHP/7.2.0
          Datenbank-Client Version: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: b3.. $
          PHP-Erweiterung: mysqliDokumentation curlDokumentation mbstringDokumentation
          PHP-Version: 7.2.0
          
          1. Tach!

            ich habe

            SELECT *,group_concat(idv)
            FROM `xlieder`
            left join xjvl on xjvl.idl=xlieder.id
            where xlieder.id=6
            group by xjvl.idv
            order by xlieder.id
            

            und bekomme

            id|Aufsteigend|1|title|idv|idl|group_concat(idv) 6|eieiDeius|1|6|1 6|eieiDeius|2|6|2

            Fehler meinerseits. Das Gruppieren muss über idl erfolgen, das GROUP_CONCAT() aber weiterhin über idv.

            Die Abfrage lässt sich auch ohne Join stellen, dafür mit Corellated Subquery. Auf diese Weise entfällt, dass ein kartesiches Produkt gebildet wird, das man dann wieder rauskürzen muss. Und meiner Meinung nach drückt das auch besser/direkter aus, was man eigentlich für ein Ergebnis haben möchte.

            SELECT *, (SELECT GROUP_CONCAT(idv) FROM xjvl WHERE xjvl.idl = xlieder.id)
            FROM xlieder
            WHERE EXISTS(SELECT * FROM xjvl WHERE xjvl.idl = xlieder.id)
            

            Das WHERE ist nur drin, um Lieder ohne Verknüpfung in xjvl nicht Ergebnis zu haben.

            dedlfix.

            1. Jau!

              Danke auch für das extra Where.

              Horst

          2. Hi there,

            und da müsste eigentlich 1,2 stehen. .Konten im Gehirn:

            Geil. Ich habe meine auf der Bank. Was zahlt man denn so monatlich für ein Konto im Gehirn?

  2. Hallo joehosch,

    Schade, dass laut Vorschau die Seite keinen Zeilenumbruch unterstützt, sondern nur einen Absatzumbruch.

    Oberhalb des Texteingabefeldes ist ein rotes Fragezeichen.

    Ein Klick darauf bringt dich zu einer
    Hilfeseite
    auf der du sehen
    kannst,
    dass Zeilenumbrüche sehr wohl möglich sind.

    Bis demnächst
    Matthias

    --
    Rosen sind rot.