Würfeldatenbank

DrNoD

Benutzer
Beiträge
8
Hallo,

ich habe in einer Datenbank meine Würfelsammlung erfasst. Diese beinhalten verschiedene Werte.
z.b. Grösse, Gewicht usw.
Ich habe Würfel die zu einem Set gehören z.b. ein 7er Set mit einer Setnummer im Datenatz gekennzeichnet.

Nun mein Problem:

Ich habe einen Filter, bei dem ich die Datensätze immer mehr einschränken kann um bestimmte Würfel zu finden.
Sieht dann ungefähr so aus: mysql_query("SELECT * FROM dice $where");

$where wird dann entsprechend der Filter ergänzt.

z.b. Materialfilter: $where = $where." AND material=".$material;
usw.

Jetzt möchte ich einen Filter (addierend zu den anderen) anwenden, welcher mir Nur die Datensätze ausgibt, die im Feld "diceset" einen Wert stehen haben und dazu X mal vorkommen. Z.b. 7mal für ein 7er Set.

Gruss
 
Werbung:
Wie ist denn der Wert in diceset aufgebaut, ist da eine Seriennummer? Woher weiß ich dann wie umfangreich ein Set ist? Oder steht da immer Xer Set, dann brauche ich die Set ID...

In etwa könnte das so gehen:
Code:
SELECT   *
FROM   tabelle
WHERE   diceset_id=".$diceset_id"
AND     diceset_anzahl = (   SELECT   count(*)
               FROM   tabelle t
               WHERE   t.diceset_id = tabelle.diceset_id )
kann aber auch sein das MySQL meinen Code nicht mag, abgesehen davon das wir erstmal zwischen eindeutiger Set Zuordung und Anzahl der Würfel im Set unterscheiden müssen.
 
Danke für die Antwort. Ich weiss nicht genau ob das meine Lösung ist. Kenne mich nicht so gut mit solchen verschachtelten Dingen aus.

Zur Erklärung. Ein 7er Set sagen wir mal es wäre dann die diceset_id: 23, hätte dann in jedem Datensatz bei diceset_id den Wert 23 stehen. Bei einem 2er Set mit der ID 17, dann eben 2 Datensätze mit 17 jeweils.
Es gibt keine andere Datenbank in der die diceset_id definiert ist.

Wenn ich ein neues Set anlege, wird einfach die nächste höhere Zahl als Setnummer genommen.

Die Setnummer spielt später auch keine Rolle mehr.

Aktuell kann ich z.b. durch Filter nur Sets anzeigen lassen.

$where = $where." AND diceset != 0"; $order = "ORDER by diceset DESC";

Hab mich übrigends geirrt, der Hauptquery sieht so aus:

// Hauptquery
$result = mysql_query("SELECT * FROM dice $where GROUP BY id $order $limit");
 
Okay also deine dicesets haben einen künstlichen Schlüssel dessen Wert das diceset nur identifiziert, aber nichts über seinen Umfang aussagt. Ich hatte dich so verstanden das du nur vollständige dicesets anzeigen willst, dazu hätte es natürlich einer Angabe zum Umfang gebraucht.
die im Feld "diceset" einen Wert stehen haben und dazu X mal vorkommen. Z.b. 7mal für ein 7er Set.
X ist in diesem Fall nicht zu bestimmen, ich kann nur diceset 1 anzeigen und wenn dort 7 Datensätze gefunden werden gilt es als 7er Set. Ich kann aber nicht sagen ob es vollständig ist oder ob ein Datensatz fehlt.

Am besten du postest mal Beispieldatensätze für ein Set und was du als Ergebnis haben willst.
 
Ich denke mal, das alles ist ein Fall für COUNT und HAVING. Nur weiß ich nicht, woher man die Information bekommt, wie viele zu einem Set gehören.
 
Also die Infos, wieviele zu einem Set gehören, ergibt sich anhand der Anzahl in der Datenbank. Es gibt z.b. ein 2er Set. Da ist beidesmale dann die diceset id z.b. 113. Also in jedem der beiden Datensätze steht dann 113 bei diceset.
Bei einem 7er Set mit z.b. der diceset id 75, gibt es eben 7 Datensätze mit der diceset id 75.

Ich möchte nur z.b. per Formular dann auswählen können: zeige mir alle Sets, welches z.b. aus 7 oder 2 Würfeln besteht.

Auf http://www.würfelsammler.de/index.php?action=dicepictures könnt ihr Filter ausklappen, dann seht ihr bestimmt was ich meine. Ich will die Ergebnisse immer weiter einschränken.

Aktuell ist nur möglich "Set" anzuwählen und dann weiter nach Grösse, Farbe, etc zu filtern.
Das Ziel ist dann z.b. "Set 7er" oder "Set 2er" aufzulisten (Natürlich plus die anderen Filter, nach wie vor.)
 
Ich glaube ich habe dafür irgendwie nicht genug Verständnis für weitergehende Funktionen von MySQL.

Ich dachte mir, dass es irgendwie möglich sei, so auf die Art Selecte mir alles, was Farbe blau ist, Grösse 12mm und in der Datenbank 7x den Setwert von 112 hat :D Aber ich glaub ohne ne seperate php Abfrage scheints nicht zu gehn.
 
Code:
SELECT   *
FROM   tabelle
WHERE   diceset_id IN (   SELECT   t.diceset_id
             FROM   tabelle t
             GROUP BY t.diceset_id
             HAVING count(*) = ".$diceset_anzahl" )
So würdest du alle Würfel-Datensätze bekommen deren diceset_id X mal eingetragen wurde. Das ließe sich erweitern mit Farbe und Größe wie du es bisher gemacht hast, für die Anzahl musst du nur die Bedingung diceset_id (oder bei dir einfach Spalte "diceset") IN ( Subselect mit Variable ) machen.
 
Du kannst das auch in PHP machen, Du kannst auch den Nagel für das Wandbild mit dem Vorschlaghammer in die Gipskartonwand hämmern.

Du kannst Deine Daten auch mit PHP auswerten. Elegant ist das natürlich nicht. Und auch nicht schnell.
 
Danke ukulele, ich werde das mal testen. Vielleicht lerne ich ja noch auf meine alten Tage was dazu.

@akretschmer, ja. Ich hätte schon gerne die sinnvollste Lösung dieses Problems :D
 
Code:
SELECT *
FROM dice
WHERE diceset IN (  SELECT diceset
   FROM  dice
   GROUP BY diceset
   HAVING count(*) = 7 )
GROUP BY id
ORDER by diceset

Habe das mal auf diese Weise ausprobiert. Allerdings läuft die Anfrage ewig und bringt dann einen Timeout (Habe es in Phpmyadmin getestet)
 
Das Subquery scheint zu gehen. Allerdings ist das Ergebnis nicht das war ich mir vorgestellt habe.

Er gibt tatsächlich die betroffenen Datensätze, welche 7mal mit der gleichen diceset id vorkommen aus, gruppiert diese aber. Das heisst, pro 7er Würfelset bekomme ich dann nur noch einen Datensatz raus.
Dies ist aber nicht das was ich brauche. Er soll schon die 7 Datensätze jeweils ausgeben. Ich möchte ja alle 7 Würfel dieses Sets anzeigen lassen.
 
Werbung:
Ja das Subquery guckt, welche Würfelsets 7mal vorkommen (können ja auch mehrere sein) und das eigentliche Query sag das die ID des Würfelsets in der Ergebnisliste des Subquerys sein muss, was eigentlich dann alle Datensätze sein müssten die in einem beliebigen Set mit 7 Würfeln vorkommen.

Ich sehe grade du hast falsch geklammert:
Code:
SELECT   *
FROM   dice
WHERE   diceset IN (   SELECT   diceset
             FROM   dice
             GROUP BY diceset
             HAVING count(*) = 7 )
Das HAVING und GROUP BY gehören zum Subselect.
 
Zurück
Oben