PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unbekannte Anzahl an Spalten



oafish
30-03-2005, 10:01
Hallo,
ich habe ein kleines MySQL Problem. Ich habe eine Datenbank, bei der die ersten 5 Spalten immer fix sind. Die restlichen Spaltenanzahl ist unbekannt.
Meine Frage ist nun, wie erhalte ich nun die Namen der Spalten bzw. auch deren Anzahl?
Kann ich eigentlich mittels MySQL 4.0.x auch unterabfragen machen? Beispielsweise: UPDATE person SET alter=20 WHERE frau = (SELECT geschlecht FROM db2.db);

Danke & Grüßle
oafish

Pingu
30-03-2005, 10:34
Hallo,
ich habe ein kleines MySQL Problem. Ich habe eine Datenbank, bei der die ersten 5 Spalten immer fix sind. Die restlichen Spaltenanzahl ist unbekannt.
Meine Frage ist nun, wie erhalte ich nun die Namen der Spalten bzw. auch deren Anzahl?
Das kann nicht sein. Das ist schlechtes Datenbanklayout. Denn eine Tabelle hat immer eine definierte Anzahl an Spalten, ansonsten kann sie gar nicht angelegt werden.

Informationen zu Tabellen? RTFM: http://dev.mysql.com/doc/mysql/de/show-database-info.html



Kann ich eigentlich mittels MySQL 4.0.x auch unterabfragen machen? Beispielsweise: UPDATE person SET alter=20 WHERE frau = (SELECT geschlecht FROM db2.db);
öhm ... RTFM ... http://dev.mysql.com/doc/mysql/en/subqueries.html

Pingu

oafish
30-03-2005, 11:13
Schon klar, nur das Problem ist, die Spalten werden von einem php-Skript je nach Bedarf generiert. Mal werden nur 10 mal 500 Spalten neu angelegt. Ich dachte nun, es gäbe einen Befehl in MySQL um sich dies anzeigen zu lassen.

Ich hätte dann noch eine Frage zu den Spaltennamen, kann ich diese irgendwie auslesen?

oafish

Christoph
30-03-2005, 13:42
Schon klar, nur das Problem ist, die Spalten werden von einem php-Skript je nach Bedarf generiert.

Pingu hat recht, da ist wohl was an Deinem Design oberfaul. Tabellenstrukturen werden im regulären Betrieb nicht dynamisch geändert, sondern nur Tabelleninhalte. Punkt.

Rausfinden lässt sich die Tabellnstruktur immer mittels Abfragen auf den "System Catalog" (oder bei Oracle: "Data Dictionary"). Allerdings nicht DB-unabhängig. Oracle hat z.B. all_table_columns usw., wie die Katalogtabellen bei MySQL heißen musst Du der MySQL-Doku entnehmen.

Matflasch
30-03-2005, 15:59
Was sind denn für Daten in den Tabellen und aus welchem Grund lässt du die Tabelle so erstellen mit X Spalten?

Evtl können wir dir helfen, das Design ein wenig zu verbessern.

Mfg, Matflasch

Draco
30-03-2005, 17:36
Den nutzen solchen Dynamischen Spalten ist groß ,zum Beispiel in einen Forum
wo man zusätzliche Felder für das Profiel selbst anlegen kann.Ich verwende dies für ein Rechtemanagement für ein CMS.Die Tabellennamen sollten aber in einer Config Datei abgespeichert werden ,weil dies nicht gerade schnell ist.


function get_table_list($table_name)
{
$result=mysql_list_fields($this->sql['db_name'],$table_name);
$menge=mysql_num_fields($result);
for($i=0;$i<$menge;$i++)
{
$array[$i]=mysql_field_name($result,$i);
}
return $array;
}

Edit: Ich habe hier den Admin gemeint und nicht die Nutzer in den CMS.

mwanaheri
30-03-2005, 18:09
Das ist erheblich mehr Freiheit, als ich den Nutzern je zugestehen würde. Mindestens würde ich die Anzahl der frei definierbaren Felder begrenzen.
Und dann für jedes Feld drei Spalten anlegen mit Bezeichnung, typ und Inhalt.
Bezeichnung vergibt der Nutzer, Typ setzt der Nutzer, der Inhalt wird stets als Varchar gespeichert. Dann muss natürlich deine Software gegebenenfalls eine Menge Umsetzungen machen, z.B. von String zu date, aber immerhin kriegst du einen festen Tabellensatz und kannst sogar die ganzen Benutzerangaben aller Benutzer in einer Tabelle speichern.

PS:
Falls du die Einschränkung nicht machen willst:
(die 5 Standardfelder) | laufende Nummer| Nutzer | Bezeichnung | typ | Inhalt

und schon darf ein Nutzer wieder 300 "Felder" anlegen.

oafish
31-03-2005, 06:46
Hi,
danke für die Antworten und die Hilfe :)
Also die Datenbank habe ich nun grundlegend neu designed und jetzt mit einer fixen Anzahl Spalten. Allerdings habe ich noch ein Problem und weiß nicht genau wie ich das am besten anpacken kann.

Folgendes, ich habe verschiedene Spalten S1-01, S2-01, S3-01, S4-01 etc.
Insgesamt also ca. 50 Stück. Nun möchte ich, das alle Spalten, die den Wert 1 besitzen, den Name der Spalte ohne das '-01' in die Zelle einträgt.

Mein Konstrukt sieht im moment folgendermaßen aus:

UPDATE personen SET LEFT(hier brauche ich den spaltenname,2) WHERE
(SELECT * FROM personen WHERE S1-01 =1 OR S2-01 = 1 OR etc.);

Nur leider weiß ich nicht, wie ich nun den Spaltenname erhalte. Ist dies mit reinem MySQL überhaupt möglich? Ich möchte eigentlich soviel wie möglich mittels SQL machen. Vielleicht mache ich es auch nur zu kompliziert?

oafish
31-03-2005, 13:13
Hi,
soweit hab ich es hinbekommen. Es war eigentlich einfacher als ich zuerst gedacht hatte. Ein kleines problemchen habe ich aber noch...
Wenn ich eine Abfrage in folgender Form mache:

select a,b,c,d from personen where sp1=1 or sp2=2 or sp3=1...

Woher weiß ich dann, in welcher Spalte dann die 1 stand?

Grüßle
oafish

fs111
31-03-2005, 16:19
Die sind in der Reihenfolge, in der Du sie beim "select" angibst, und bei "*" in der Reihenfolge in der sie angelegt wurden.

fs111

mwanaheri
31-03-2005, 16:27
Ich kann mir nicht helfen, ich habe die ganze Zeit das Gefühl, dass du die Datenbank austricksen willst. Das solltest du besser nicht tun. Wenn dein Datenmodell stimmt, kommst du ziemlich sicher in fast allen Fällen mit erschütternd einfachen Abfragen aus.