Gibt es eine Möglichkeit, nach einem eindeutigen (primären) Schlüssel zu gruppieren, was im Wesentlichen eine implizite Garantie dafür liefert, dass die anderen Spalten aus dieser Tabelle wohldefiniert sind?GROUP BY nur Primärschlüssel, aber andere Werte auswählen
SELECT myPrimaryKey, otherThing
FROM myTable
GROUP BY myPrimaryKey
Ich weiß, dass ich die anderen Spalten die Erklärung hinzufügen (GROUP BY myPrimaryKey,otherThing
), aber ich versuche, das zu vermeiden. Wenn Sie neugierig sind, warum, lesen Sie weiter:
ich eine Aussage haben, die im wesentlichen dies tut:
SELECT nodes.node_id, nodes.node_label, COUNT(1)
FROM {a couple of joined tables}
INNER JOIN nodes USING (node_id)
GROUP BY nodes.node_id, nodes.node_label
der gut arbeitet, ist aber ein bisschen langsam in MySQL. Wenn ich nodes.node_label
aus dem GROUP BY
entferne, läuft es etwa 10x schneller (laut EXPLAIN
, dies ist, weil einer der früheren Joins beginnt, einen Index zu verwenden, wenn es zuvor nicht getan hat).
Wir sind im Prozess Postgres migrieren, so dass alle neuen Aussagen sollen mit beide MySQL und Postgres, wenn möglich, kompatibel sein. Jetzt in Postgres, die ursprüngliche Anweisung läuft schnell, aber die neue Anweisung (mit der reduzierten Gruppe von) wird nicht ausgeführt (weil Postgres strenger ist). In diesem Fall ist es ein falscher Fehler, da die Anweisung tatsächlich gut definiert ist.
Gibt es eine Syntax, die ich verwenden kann, die die gleiche Anweisung in beiden Plattformen ausgeführt wird, während MySQL nur eine Spalte in der Gruppe für Geschwindigkeit verwenden?
'In diesem Fall ist es ein falscher Fehler, weil die Aussage eigentlich gut defined.' ist Nein nein nein, MySql akzeptiert Weirds Dinge für GROUP BY (mit unvorhersehbaren Ergebnissen), alle anderen DBMS zwingen Sie zu vorhersehbaren Ergebnissen (was normalerweise nützlich ist). Um eine Lösung zu finden, würde ich lieber an der Indexverwaltung arbeiten, um MySql Langsamkeit zu vermeiden! –
@ RaphaëlAlthaus normalerweise das stimmt, aber die Gruppierung nach dem Primärschlüssel (oder irgendeinem 'UNIQUE'-Schlüssel) stellt sicher, dass alle anderen Werte in der gleichen Tabelle gut definiert sind. – Dave
aber ich bezweifle, dass es so ein dbms funktioniert. Ich denke nicht, dass das Abfrage-Scannen und Parsing nach Primärschlüsseln/eindeutigen Schlüsseln sucht. Das kommt nach (Abfrageoptimierung/Ausführungsstrategie) ... –