2017-06-06 3 views
1
mysql> select * from dts; 
+----+------+------+--------+------+------+------+------+------+ 
| Id | key1 | key2 | serial | pr1 | pr2 | pr3 | pr4 | pr5 | 
+----+------+------+--------+------+------+------+------+------+ 
| 1 | 1 | 1 |  1 | 0 | 0 | 1 | 0 | 2 | 
| 2 | 1 | 1 |  2 | 0 | 0 | 0 | 0 | 0 | 
| 3 | 1 | 1 |  3 | 0 | 0 | 0 | 1 | 0 | 
| 4 | 1 | 1 |  4 | 1 | 0 | 1 | 1 | 3 | 
| 5 | 1 | 2 |  5 | 0 | 0 | 0 | 2 | 5 | 
| 6 | 1 | 2 |  6 | 0 | 0 | 0 | 0 | 1 | 
| 7 | 1 | 2 |  7 | 0 | 1 | 0 | 0 | 0 | 
| 8 | 2 | 2 |  1 | 1 | 1 | 1 | 1 | 2 | 
| 9 | 2 | 2 |  2 | 0 | 0 | 0 | 0 | 0 | 
| 10 | 3 | 2 |  3 | 0 | 0 | 0 | 0 | 0 | 
| 11 | 3 | 3 |  1 | 1 | 1 | 0 | 0 | 1 | 
| 12 | 3 | 3 |  5 | 0 | 0 | 1 | 1 | 0 | 
+----+------+------+--------+------+------+------+------+------+ 
12 rows in set (0.00 sec) 

Logic ich will, ist hier zu implementieren, wieMySQL Query-Optimierung und Manipulation von Feldwert

  1. Prüfung folgt, ist es ein Nicht-Null-Daten in den Feldern (PR1-pr5) der Tabelle dts ?
  2. Wenn gefunden concat Feldname mit Komma, angenommen, wenn alle Felder nicht Null sind, nur concat Felder und aufhören zu lesen Datensätze des gleichen Schlüssels (Kombination von Schlüssel1, Schlüssel2, um Ausführungszeit zu speichern, schauen Sie es Zeile über Tabelle für key1 = 2 und key2 = 2 alle sind nicht Null, so stoppen nächste Datensatz mit dem gleichen Schlüssel) zu lesen, gehen Sie zum nächsten Tasten 1, 2

Was nicht funktioniert ist als

folgt

Zur Zeit Code, den ich benutze, funktioniert, aber es nicht überspringt Zeile lesen, wenn genug Felder gefunden werden, wie Sie für aktuelle Beispiel sehen können, erstellt 12 Zeilen X 5 Col = 60 Zeilen (wenn Sie innere ausführen Select-Anweisung es gibt 60 Zeilen zurück) und gruppiert es dann durch key1 und key2, kann es in jeder einfachen Weise getan werden, die auch effizient ist, damit Tabelle mit 2-3 Million Aufzeichnungen schneller ist.

Erwarteter Ausgang

+------+------+---------------------+ 
| key1 | key2 | prs     | 
+------+------+---------------------+ 
| 1 | 1 | pr1,pr3,pr4,pr5  | 
| 1 | 2 | pr2,pr4,pr5   | 
| 2 | 2 | pr1,pr2,pr3,pr4,pr5 | 
| 3 | 2 | NULL    | 
| 3 | 3 | pr1,pr2,pr3,pr4,pr5 | 
+------+------+---------------------+ 

So, wie dies vereinfacht werden kann Leistung mit großem Tisch zu verbessern, wie Sie sehen können über meine Absicht, einfach, ich will nur, wie viele Felder sehen (PR1-pr5) existiert mit nicht-Null-Wert für die einzelnen Kombinationen von Tasten 1, 2

-Code ist mit

SELECT 
    key1, 
    key2, 
    group_concat(distinct case when val > 0 then pr end order by pr separator ',') prs 
FROM (
    SELECT 
     d.key1, 
      d.key2, 
      t.pr, 
      CASE t.pr 
       WHEN 'pr1' THEN pr1 
       WHEN 'pr2' THEN pr2 
       WHEN 'pr3' THEN pr3 
       WHEN 'pr4' THEN pr4 
       WHEN 'pr5' THEN pr5 
      END val 
    FROM 
     dts d 
    CROSS JOIN (
     SELECT 'pr1' pr UNION ALL 
     SELECT 'pr2' UNION ALL 
     SELECT 'pr3' UNION ALL 
     SELECT 'pr4' UNION ALL 
     SELECT 'pr5' 
    ) t 
) r 
GROUP BY key1 , key2; 

Struktur

DROP TABLE IF EXISTS `dts`; 
CREATE TABLE `dts` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `key1` int(11) DEFAULT '-99', 
    `key2` int(11) DEFAULT '-99', 
    `serial` int(11) DEFAULT '-99', 
    `pr1` int(11) DEFAULT '-99', 
    `pr2` int(11) DEFAULT '-99', 
    `pr3` int(11) DEFAULT '-99', 
    `pr4` int(11) DEFAULT '-99', 
    `pr5` int(11) DEFAULT '-99', 
    PRIMARY KEY (`Id`), 
    KEY `main` (`key1`,`key2`,`serial`) 
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1; 


LOCK TABLES `dts` WRITE; 
INSERT INTO `dts` VALUES (1,1,1,1,0,0,1,0,2),(2,1,1,2,0,0,0,0,0),(3,1,1,3,0,0,0,1,0),(4,1,1,4,1,0,1,1,3),(5,1,2,5,0,0,0,2,5),(6,1,2,6,0,0,0,0,1),(7,1,2,7,0,1,0,0,0),(8,2,2,1,1,1,1,1,2),(9,2,2,2,0,0,0,0,0),(10,3,2,3,0,0,0,0,0),(11,3,3,1,1,1,0,0,1),(12,3,3,5,0,0,1,1,0); 
UNLOCK TABLES; 

Blockquote

Antwort

1
SELECT key1, key2, 
     CONCAT_WS(',', 
     IF(pr1=0, NULL, 'pr1'), 
     IF(pr2=0, NULL, 'pr2'), 
     IF(pr3=0, NULL, 'pr3'), 
     IF(pr4=0, NULL, 'pr4'), 
     IF(pr5=0, NULL, 'pr5')) AS prs 
    FROM (
      SELECT key1, key2, 
       SUM(pr1) AS pr1, 
       SUM(pr2) AS pr2, 
       SUM(pr3) AS pr3, 
       SUM(pr4) AS pr4, 
       SUM(pr5) AS pr5 
      FROM dts 
      GROUP BY key1, key2 
     ) AS sums; 

Wenn Sie "NULL" in der 3,2 Reihe benötigen, können Sie ein IFNULL um es zu beheben hinzuzufügen.

+0

dies wirklich eine verbesserte Leistung, vielen Dank – user3637224

+0

kann dies nicht nur 'SELECT Tasten 1, 2, CONCAT_WS (‘, 'IF (SUM (PR1),' PR1' , NULL), IF (SUM sein (pr2), 'pr2', NULL), IF (SUM (pr3), 'pr3', NULL), IF (SUM (pr4), 'pr4', NULL), IF (SUM (pr5), ' (pr5 ', NULL)) AS prs VON dts GROUP BY Schlüssel1, Schlüssel2' oder wird es jedes Problem erstellen, wenn ich das mag – user3637224

+0

@ user3637224 - Sieht richtig aus und kein Problem. Schreibe das als Antwort auf und nimm die "beste Antwort" von mir weg. –