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
- Prüfung folgt, ist es ein Nicht-Null-Daten in den Feldern (PR1-pr5) der Tabelle dts ?
- 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
folgtZur 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
dies wirklich eine verbesserte Leistung, vielen Dank – user3637224
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
@ user3637224 - Sieht richtig aus und kein Problem. Schreibe das als Antwort auf und nimm die "beste Antwort" von mir weg. –