Unterabfrage lieferte mehr als einen Datensatz zurück - was sonst?
joehosch
- datenbank
- mysql
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
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.
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.
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.
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.
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
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.
Jau!
Danke auch für das extra Where.
Horst
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?
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