Hallo,
ich könnte mal einen kleinen Denkanstoß gebrauchen, ob/wie folgendes optimiert werden muss.
Ich habe folgende Tabelle:
Für den Fall, dass es jemand testen will, pack ich noch ein paar Daten dazu:
Nun will ich zu einer link_sub sämtliche anderen link_sub's mit der selben link_super haben. Oder einfacher ausgedrückt: Gegeben ist eine sub-Id (zu verstehen als Id eines Unteraccounts), und ich will sämtliche anderen sub-Ids haben, die zu dem selben Oberaccount (super-id) gehören.
(Ich nehm als Beispiel jetzt immer sub_id = 1)
Mit Subqueries wäre es ja simpel:
Aber die stehen mir leider nicht zur Verfügung.
Nun wüsste ich gerne, was die sinnvollste Alternative ist. Eine Möglichkeit wäre ja, daraus zwei Queries zu machen, was natürlich nicht sehr schön ist. Die anderen Möglichkeiten basieren darauf, die Tabelle mit sich selbst zu joinen:
Was ist nun am sinnvollsten?
Eigentlich gefallen mir die self-joins nicht so, da mysql dann ja erstmal seeehr viele Resultate erzeugt und distinct nur hinterher alle mehrfachen raussortiert. Gibt es eine gute Lösung ohne subquery?
Die distinct-lösungen haben nebenbei noch den Nachteil, dass ich mir nicht gleichzeitig link_super ausgeben lassen kann, da dann das Ergebnis vermurkst wird.
Danke,
Hannes
ich könnte mal einen kleinen Denkanstoß gebrauchen, ob/wie folgendes optimiert werden muss.
Ich habe folgende Tabelle:
Code:
CREATE TABLE `abforum_accountlinker` (
`link_super` int(10) unsigned NOT NULL default '0',
`link_sub` int(10) unsigned NOT NULL default '0',
KEY `super` (`link_super`),
KEY `sub` (`link_sub`)
) TYPE=MyISAM;
Für den Fall, dass es jemand testen will, pack ich noch ein paar Daten dazu:
Code:
INSERT INTO `abforum_accountlinker` VALUES (1, 10);
INSERT INTO `abforum_accountlinker` VALUES (1, 17);
INSERT INTO `abforum_accountlinker` VALUES (1, 73);
INSERT INTO `abforum_accountlinker` VALUES (1, 248);
INSERT INTO `abforum_accountlinker` VALUES (1, 899);
INSERT INTO `abforum_accountlinker` VALUES (1, 1);
INSERT INTO `abforum_accountlinker` VALUES (2, 4);
INSERT INTO `abforum_accountlinker` VALUES (3, 2);
INSERT INTO `abforum_accountlinker` VALUES (4, 6);
INSERT INTO `abforum_accountlinker` VALUES (5, 3);
INSERT INTO `abforum_accountlinker` VALUES (6, 2);
INSERT INTO `abforum_accountlinker` VALUES (7, 7);
INSERT INTO `abforum_accountlinker` VALUES (8, 5);
INSERT INTO `abforum_accountlinker` VALUES (8, 18);
INSERT INTO `abforum_accountlinker` VALUES (9, 9);
INSERT INTO `abforum_accountlinker` VALUES (10, 8);
INSERT INTO `abforum_accountlinker` VALUES (10, 11);
INSERT INTO `abforum_accountlinker` VALUES (10, 16);
INSERT INTO `abforum_accountlinker` VALUES (10, 44);
INSERT INTO `abforum_accountlinker` VALUES (11, 20);
INSERT INTO `abforum_accountlinker` VALUES (11, 12);
INSERT INTO `abforum_accountlinker` VALUES (12, 15);
INSERT INTO `abforum_accountlinker` VALUES (12, 13);
Nun will ich zu einer link_sub sämtliche anderen link_sub's mit der selben link_super haben. Oder einfacher ausgedrückt: Gegeben ist eine sub-Id (zu verstehen als Id eines Unteraccounts), und ich will sämtliche anderen sub-Ids haben, die zu dem selben Oberaccount (super-id) gehören.
(Ich nehm als Beispiel jetzt immer sub_id = 1)
Mit Subqueries wäre es ja simpel:
Code:
SELECT link_sub FROM `abforum_accountlinker` WHERE link_super = (SELECT link_super FROM `abforum_accountlinker` WHERE link_sub = 1)
Nun wüsste ich gerne, was die sinnvollste Alternative ist. Eine Möglichkeit wäre ja, daraus zwei Queries zu machen, was natürlich nicht sehr schön ist. Die anderen Möglichkeiten basieren darauf, die Tabelle mit sich selbst zu joinen:
Code:
SELECT DISTINCT l2.link_sub FROM `abforum_accountlinker` AS l1 LEFT JOIN `abforum_accountlinker` AS l2 ON l1.link_super = l2.link_super WHERE l1.link_sub = 1
oder
SELECT DISTINCT l2.link_sub FROM `abforum_accountlinker` AS l1 , `abforum_accountlinker` AS l2 WHERE l1.link_sub = 1 AND l1.link_super = l2.link_super ;
Was ist nun am sinnvollsten?
Eigentlich gefallen mir die self-joins nicht so, da mysql dann ja erstmal seeehr viele Resultate erzeugt und distinct nur hinterher alle mehrfachen raussortiert. Gibt es eine gute Lösung ohne subquery?
Die distinct-lösungen haben nebenbei noch den Nachteil, dass ich mir nicht gleichzeitig link_super ausgeben lassen kann, da dann das Ergebnis vermurkst wird.
Danke,
Hannes