Ich habe eine Tabelle, die mehrere Schlüssel in andere Tabellen enthält (wobei jeder Schlüssel aus mehreren Spalten besteht). Ich möchte in der Lage sein, Zeilen mit einem gleichen Schlüssel zu gruppieren, aber ich möchte nicht alle zusammen gruppieren . Es ist nicht einfach GROUP BY
für den Schlüssel, sondern ich möchte in der Lage sein, Gruppen von beispielsweise 10 zu bilden. Wenn also ein bestimmter Schlüssel 50 Mal auftaucht, würde ich bei dieser Gruppierung 5 Ergebnisse erhalten (5 Gruppen von 10). Ich möchte auch, dass diese Gruppierung innerhalb des Schlüssels zufällig erfolgt.
Ich wusste nicht, wie ich das direkt tun sollte, und die von mir entwickelte Kreisverkehrsmethode funktioniert nicht so, wie ich es mir vorgestellt habe. Die Kreisverkehrslösung, die ich mir ausgedacht habe, bestand darin, für jeden Schlüssel eine neue Spalte zu erstellen, die eine Ganzzahl ist, sodass der Wert i
das ith
Auftreten dieses Schlüssels darstellt (jedoch in zufälliger Reihenfolge). Ich könnte dann eine Ganzzahldivision durchführen, so dass alle n (sagen wir 10) Zeilen innerhalb des Schlüssels den gleichen Wert haben, und ich könnte einen GROUP BY
für diesen Wert ausführen.
Gibt es einen direkteren Weg, um das zu erreichen, was ich gerade beschrieben habe? Es ist ziemlich umständlich und ich hatte Probleme beim Erstellen der neuen Indexspalte (wie in dieser Frage beschrieben ).
EDIT: Beachten Sie zunächst, dass dies für MySQL ist. Ich werde ein Beispiel hinzufügen, falls mein Ziel nicht klar ist. Die MySQL-Dokumente zeigen eine Methode, um fast dorthin zu gelangen :
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Dadurch wird eine Tabelle erstellt, die, obwohl nicht das, was ich möchte, nahe kommt:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
Ich möchte im Wesentlichen eine GROUP BY
ID, außer ich möchte, dass die Datensätze mammal
eine "Gruppe" für die IDs 1-10, eine andere "Gruppe" für die IDs 11-20 usw. haben. Ich würde dies jedoch mit einer vorhandenen Tabelle tun. und ich würde nicht unbedingt wollen, dass "Hund" mit ID 1 auftaucht. Ich möchte, dass diese anfängliche Reihenfolge zufällig ist, aber dann von da an deterministisch.
numMammal
. Es ist mir egal, was die ID dog
bekommt, aber ich möchte nicht, dass es von der ursprünglichen Einfügereihenfolge abhängt.
GROUP BY
. Ich möchte dann vielleicht Gruppen von 10 koppeln, um die Korrelation zwischen dem Durchschnitt zu finden. Ich brauche diese zufällige Reihenfolge, denn wenn die ursprüngliche Einfügereihenfolge nach Gewicht sortiert wäre, würde dies zu falschen Ergebnissen führen. Ich hoffe ich mache Sinn.
I would want that initial ordering to be random, but then deterministic from then out.
<- sag was? Ich denke, egal was Sie tun, Sie müssen die Aufzeichnungen in eine zweite Tabelle legen. Wie genau funktioniert diese Geschäftslogik? Es gibt nichts zu verlangen, dass (zum Beispiel) der Hund an erster Stelle steht. Und was meinst du mitI would want the records from *mammal* to have one "group" for IDs 1-10, and another for IDs 11-20
... kannst du das mit einer anderen Tabelle veranschaulichen, die sich auf Säugetiere konzentriert, in der obigen Fragebeschreibung?