Hallo Helmut,
???
Tut mir leid, aber dieses Prinzip verhindert prinzipiell jede Hilfe.
Du hattest den Gegenbeweis bereits angetreten, denn Deine erste Antwort war ja genau die Antwort auf meine Frage.
Nein, ich kann Dir nicht prinzipiell helfen! Ich kann Dir konkret helfen! Aber nicht mit diesen absolut unzureichenden Angaben. Wahrscheinlich wäre statt des Selfjoins ein Subselect möglich und sinnvoll. Ob das der Fall ist, kann ich nur sagen, wenn ich konkret sehe, was Du vorhast. Dein "prinzipiell" ist ausgesprochen kontraproduktiv.
Es gibt manchmal Situationen, in denen man Details der Arbeit nicht veröffentlichen will. Vor allem aber gibt es auch Situationen, in denen man Details der Arbeit nicht veröffentlichen *darf*.
Beispieltabelle (es ist ja nur eine) mit Beispieldatensätzen, mit allen relevanten Spalten, mit den Joinbedingungen. Beispielergebnis mit Begründung.
Gut, ich habe mir jetzt mal Gedanken gemacht, wie ich
1. das Beispiel vereinfachen, dabei
2. von der eigentlich zu lösenden Aufgabe entkoppeln, und dennoch
3. das eigentlich zu lösende Problem beibehalten
kann.
Das folgende in sich vollständige Beispiel zeigt, was ich prinzipiell haben will an einem konkreten Beispiel. Insbesondere zeigt es die in meinem zweiten Post genannte Kuriosität mit dem ORDER BY:
DROP TABLE tabelle;
// Mir wäre hier eine Temporäre Tabelle lieber, aber das führt beim SELECT zu
// folgender Fehlermeldung: ERROR 1137 (HY000): Can't reopen table: 't1'
CREATE TABLE tabelle (n CHAR(1), s TINYINT, w DOUBLE);
INSERT INTO tabelle (n, s, w) VALUES
("a",1,3),("b",1,5),("c",0,2),("d",0,7),("e",0,4),("f",0,8);
SELECT t1.n AS n1, t2.n AS n2, (t1.w-t2.w)*(t1.w-t2.w) AS d
FROM tabelle AS t1, tabelle AS t2
HAVING d = (
SELECT MIN((t1.w-t3.w)*(t1.w-t3.w))
FROM tabelle AS t3 WHERE t3.s=1
);
// Liefert wie erwartet:
// +------+------+------+
// | n1 | n2 | d |
// +------+------+------+
// | a | a | 0 |
// | c | a | 1 |
// | e | a | 1 |
// | b | b | 0 |
// | d | b | 4 |
// | e | b | 1 |
// | f | b | 9 |
// +------+------+------+
// 7 rows in set (0.01 sec)
//
// Jetzt will ich nach d sortieren. Also gleicher Query + ORDER BY d:
SELECT t1.n AS n1, t2.n AS n2, (t1.w-t2.w)*(t1.w-t2.w) AS d
FROM tabelle AS t1, tabelle AS t2
HAVING d = (
SELECT MIN((t1.w-t3.w)*(t1.w-t3.w))
FROM tabelle AS t3 WHERE t3.s=1
) ORDER BY d;
// Autsch:
// +------+------+------+
// | n1 | n2 | d |
// +------+------+------+
// | e | d | 9 |
// | c | b | 9 |
// | f | b | 9 |
// | d | e | 9 |
// | b | c | 9 |
// | b | f | 9 |
// +------+------+------+
// 6 rows in set (0.00 sec)
//
// Der Ausweichansatz über Temporäre Tabelle ...
CREATE TEMPORARY TABLE t (n1 CHAR(1), n2 CHAR(1), d DOUBLE);
INSERT INTO t
SELECT t1.n AS n1, t2.n AS n2, (t1.w-t2.w)*(t1.w-t2.w) AS d
FROM tabelle AS t1, tabelle AS t2
HAVING d = ( SELECT MIN((t1.w-t3.w)*(t1.w-t3.w)) FROM tabelle AS t3 WHERE t3.s=1 );
SELECT * FROM t ORDER BY d;
// ... funktioniert dann wie gewünscht:
// +------+------+------+
// | n1 | n2 | d |
// +------+------+------+
// | a | a | 0 |
// | b | b | 0 |
// | c | a | 1 |
// | e | a | 1 |
// | e | b | 1 |
// | d | b | 4 |
// | f | b | 9 |
// +------+------+------+
// 7 rows in set (0.00 sec)
Nächste Herausforderung wäre dann noch das entfernen der Doppelten n1="e" Spalte (wobei dies mit der temporären t Tabelle durch ein einfaches GROUP BY n1 zu erreichen wäre, allerdings wollte ich diese ja gerade los werden).
Gruß, Bodo