Einzelnen Beitrag anzeigen
  #3  
Alt 24.04.2008, 22:17:11
Benutzerbild von mrweasel
mrweasel mrweasel ist offline
Anfänger
 
Registriert seit: Apr 2008
Beiträge: 5
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur

Vielen Dank für die schnelle Antwort Franzx! Freut mich so rasch willkommen geheißen zu werden.

Nachdem ich vorher mit JOIN noch überhaupt nicht gearbeitet habe, habe ich da offenbar etwas total sinnloses zusammengebastelt bei meinen JOIN-Versuchen. Egal, denn ein Code funktioniert soweit wunderbar! Danke auch dafür.


Und wie ich es mir gedacht habe komme ich um das Problem mit der Kategorie nicht herum. Ich will es noch einmal ausführlicher erklären.

Die Tabellenstrukturen:

Haupttabelle (= "bbdb_beschluesse")
ID_beschluss: primary key auto_increment
antrag_text: text
name_sitzung: varchar(1) - die ID der Tabelle bbdb_name_sitzungen wird gespeichert
arbeitsjahr: varchar(1) - die ID der Tabelle bbdb_arbeitsjahr wird gespeichert
kat1: varchar(1) - die ID der Tabelle bbdb_kategorie wird gespeichert
kat2: varchar(2) - siehe "kat1". Es können pro Datensatz/Beschluss zwei Kategorien vergeben werden

Die Felder die nicht ausgefüllt werden müssen (Nummer der Sitzung, Datum, Anmerkungen) habe ich nicht angeführt.

bbdb_name_sitzungen
ID_name_sitzung: primary key auto_increment
bez_sitzung: text

bbdb_arbeitsjahr
ID_arbeitsjahr: primary key auto_increment
bez_arbeitsjahr: text

bbdb_kategorie
ID_kategorie: primary key auto_increment
name_kategorie: text

Die drei letzten Tabellen gibt es damit im Admin-Bereich die Werte beliebig erweitert werden können (zB wenn die DB über das Arbeitsjahr 2009/10 hinaus genutzt wird) und damit ich sie in den Dropdown-Feldern in den Formularen nicht immer händisch eingeben muss sondern einfach aus der Datenbank lese.

Bevor ich noch zum eigentlichen Problem komme, noch ein paar Worte zur WHERE-Clause, die mir die Beschlüsse suchen soll. Das Suchformular hat folgende Felder: Text des Antrags, Name Sitzung (dropdown), Arbeitsjahr (dropdown), Kategorie (dropdown – nur ein Feld für die Suche), Anmerkungen.
Die WHERE-Clause stückele ich mir über if-Anweisungen in PHP zusammen je nachdem in welchem Feld etwas eingegeben wurde. Der Teil für die Kategorie sieht so aus:

PHP-Code:
if(!empty(suchfeld kategorie))
{
 
//schauen ob es ein AND benötigt falls auch anderes Feld ausgefüllt wurde
$sql $sql."(kat1 = '".$_SESSION['suche_kategorie']."' OR kat2 = '".$_SESSION['suche_kategorie']."')";
//speichern, dass dieses Feld ausgefüllt würde für mögliche weitere AND

Das Problem sind jetzt meine Felder „kat1“ und „kat2“ in der Haupttabelle. Wie oben erwähnt soll es möglich sein für einen Beschluss 1 bis 2 Kategorien festlegen zu können. Bei der jetzigen Lösung entspricht es glaube ich erstens nicht der zweiten Normalform und wirkt sich so aus, dass bei der von dir vorgeschlagenen SELECT-Lösung mit den INNER JOINs jeder DS nur mit dem verknüpften Wert des Felds „kat1“ ausgegeben wird.
Dass ich im SELECT den INNER JOIN für die Kategorie-Tabelle wie folgt angepaßt habe brachte nur, dass nun jeder DS, welcher zwei zugewiesene Kategorien gespeichert hat, zwei Mal ausgegeben wird – einmal mit dem Wert für „kat1“ und einmal für „kat2“.

PHP-Code:
INNER JOIN bbdb_kategorie ON (bbdb_beschluesse.kat1 bbdb_kategorie.ID_kategorie OR bbdb_beschluesse.kat2 bbdb_kategorie.ID_kategorie
Wie könnte ich hier weiter kommen? Hast du, Franzx, oder jemand anderer eine Idee?

Wiederum freue ich mich, wenn mir jemand helfen kann.


Einstweilen einen schönen Abend noch und bis bald!

Gruß, mrweasel
__________________
Homer: Marge, don't discourage the boy. Weaseling out of things is important to learn. It's what separates us from the animals! (pause) 'Cept the weasels.

Geändert von mrweasel (24.04.2008 um 22:20:11 Uhr)
Mit Zitat antworten