Frank: Hilfe bei einer MySQL Query (Joins, Group By, Order By)

Beitrag lesen

Hallo zusammen,

Ich möchte ein häufiges Problem, welches ich bisher immer umständlich mit PHP gelöst habe, mit MySQL-Bordmitteln lösen. Und zwar gibt es zwei Tabellen.

  
-- ----------------------------  
-- Table structure for gruppen  
-- ----------------------------  
CREATE TABLE `gruppen` (  
  `group_id` int(10) NOT NULL auto_increment,  
  `group_name` varchar(100) collate latin1_general_ci default NULL,  
  PRIMARY KEY  (`group_id`)  
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;  
  
-- ----------------------------  
-- Records  
-- ----------------------------  
INSERT INTO `gruppen` VALUES ('1', 'Fernseher');  
INSERT INTO `gruppen` VALUES ('2', 'Radio');  
INSERT INTO `gruppen` VALUES ('3', 'Toaster');  
  
-- ----------------------------  
-- Table structure for artikel  
-- ----------------------------  
CREATE TABLE `artikel` (  
  `artikel_id` int(10) NOT NULL auto_increment,  
  `group_id` int(10) default NULL,  
  `artikel_name` varchar(100) collate latin1_general_ci default NULL,  
  `artikel_preis` varchar(5) collate latin1_general_ci default NULL,  
  PRIMARY KEY  (`artikel_id`)  
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;  
  
-- ----------------------------  
-- Records  
-- ----------------------------  
INSERT INTO `artikel` VALUES ('1', '1', 'Fernseher A', '100');  
INSERT INTO `artikel` VALUES ('2', '1', 'Fernseher B', '200');  
INSERT INTO `artikel` VALUES ('3', '1', 'Fernseher C', '150');  
INSERT INTO `artikel` VALUES ('4', '2', 'Radio A', '25');  
INSERT INTO `artikel` VALUES ('5', '2', 'Radio B', '30');  
INSERT INTO `artikel` VALUES ('6', '2', 'Radio C', '40');  
INSERT INTO `artikel` VALUES ('7', '2', 'Radio D', '20');  
INSERT INTO `artikel` VALUES ('8', '3', 'Toaster A', '30');  
INSERT INTO `artikel` VALUES ('9', '3', 'Toaster B', '15');  
INSERT INTO `artikel` VALUES ('10', '3', 'Toaster C', '12');  
INSERT INTO `artikel` VALUES ('11', '3', 'Toaster D', '20');  

Ich suche jetzt eine Query für eine Liste mit den günstigsten Produkten. In der Liste darf aber jede Gruppe nur mit maximal 2 Artikeln aufgeführt sein.

Meine bisherige Lösung ist eine riesige mit Union zusammengeflickte Abfrage die von der Performance her gesehen absolut inakzeptabel ist. Bei 100-200 Datensätzen mag das noch gehen. In einem konkreten Projekt geht es aber um Tabellen mit 3Mio+ Datensätzen. Da kann so eine Query schon mal 15 Min dauern.

Daran beiße ich mir jetzt schon seit Wochen die Zähne aus, bekomme es aber ohne PHP einfach nicht hin. Ich hoffe Ihr könnt mir helfen bzw. einen Stoß in die richtige Richtung geben.

Viele Grüße
Frank