CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
23.04.2008, 22:26:12
|
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 5
|
|
Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Hallo allerseits!
Da ich nicht genau weiß nach welchen Wörtern ich für mein Problem suchen muss, habe ich über die Suchfunktion nicht viel gefunden, weshalb ich mich direkt an euch wende.
Und zwar mit folgenden zwei Fragen:
Ich erstelle mit PHP und MySQL eine Datenbank-Lösung worin Beschlüsse eines Vereins gespeichert werden und nach bestimmten Kriterien können diese gesucht werden.
Dazu habe ich eine Haupttabelle die zB den Text des Beschlusses/Antrags, Anmerkungen, ... speichert. Zusätzliche Informationen wie zB das Arbeitsjahr, der Name des entsprechenden Vereinsgremiums (= "Sitzung") und auch die "Kategorie" unter welcher der Beschluss fällt werden in extra Tabellen definiert und in der Haupttabelle mit den IDs gespeichert.
Die Haupttabelle steht also in einer N:1 Beziehung mit den Nebentabellen (arbeitsjahr, sitzung, kategorie) über die ID-Nummern.
Für die Such-Funktion habe ich ein Formular erstellt in welchem ein oder mehrere Werte zur Suche eingegebenen werden können. Die Werte für das Arbeitsjahr, Sitzung und Kategorie können über ein Dropdown-Feld ausgewählt werden. Nun würde ich gerne, wenn das Ergebnis der Suche ausgegebenen wird, dass bei den Feldern wie Arbeitsjahr, ... nicht die ID-Nummern (welche ja in der Haupttabelle stehen) ausgegeben werden, sondern die entsprechende Werte in Worten (welche ja in den Nebentabellen definiert werden) angezeigt werden.
Ich habe es über versch. JOIN-Arten schon probiert. Meistens werden die entsprechenden Datensätze zu oft angezeigt, da zB für jeden Wert der Tabelle "arbeitsjahr" der entsprechende Beschluss ausgegeben wird.
Meine erste Frage wäre also ob jemand von euch eine geeignete SQL-Abfrage wüsste?
Im Zuge meiner Lösungsversuche habe ich auch probiert mit "GROUP BY ID_beschluss" (ID_beschluss ist der Primärschlüssel der Haupttabelle) die "zu viel" ausgegebenen Reihen zu minimieren. Dies funktioniert recht gut (habe noch nicht vollständig überprüft ob keine Daten "verschluckt" werden, aber auf den ersten, schnellen Blick scheints zu passen).
Nur bin ich dann auf ein Problem bei meiner Lösung für die "Kategorie" gestoßen.
Ich speichere in der Haupttabelle min. 1, max. 2 IDs von Kategorien ab, da ein Beschluss auch mehrere Bereiche betreffen kann. Ich habe mich vor der DB-Erstellung schon schlau gemacht und bin drauf gekommen, dass dies nicht den Normalformen von Datenbank entspricht. Stimmt das?
Anfangs hatte ich aber gehofft, dass es für mein Projekt egal sein würde. Leider wird aber bei der Lösung mit "GROUP BY" nur der Name/Wert der ID-Nummer des ersten Kategoriefeldes (der Haupttabelle) angezeigt. Da in der SQL-Abfrage nur einmal das Feld der Nebentabelle abgefragt werden kann (Auszug aus der WHERE-Clause [mit anschließendem GROUP BY]: (tbl_kategorie.ID_kategorie = tbl_beschluesse.kat1 OR tbl_kategorie.ID_kategorie = tbl_beschluesse.kat2) – ich hoffe das ist verständlich).
Somit hier also die zweite Frage: Wie kann ich dieses Problem umgehen (hängt auch mit der Lösung für meine erste Frage zusammen denke ich)?
Hoffentlich ist alles fürs Erste verständlich und ich freue mich wenn mir jemand von euch weiterhelfen kann.
Vielen Dank jetzt schon und schöne Grüße
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.
|
24.04.2008, 13:06:19
|
Junior Member
|
|
Registriert seit: Nov 2005
Ort: Bremen
Beiträge: 437
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Moin, moin mrweasel und herzlich Willkommen im Forum!
Zitat:
Zitat von mrweasel
Hallo allerseits!
Da ich nicht genau weiß nach welchen Wörtern ich für mein Problem suchen muss, habe ich über die Suchfunktion nicht viel gefunden, weshalb ich mich direkt an euch wende.
Und zwar mit folgenden zwei Fragen:
Ich erstelle mit PHP und MySQL eine Datenbank-Lösung worin Beschlüsse eines Vereins gespeichert werden und nach bestimmten Kriterien können diese gesucht werden.
Dazu habe ich eine Haupttabelle die zB den Text des Beschlusses/Antrags, Anmerkungen, ... speichert. Zusätzliche Informationen wie zB das Arbeitsjahr, der Name des entsprechenden Vereinsgremiums (= "Sitzung") und auch die "Kategorie" unter welcher der Beschluss fällt werden in extra Tabellen definiert und in der Haupttabelle mit den IDs gespeichert.
Die Haupttabelle steht also in einer N:1 Beziehung mit den Nebentabellen (arbeitsjahr, sitzung, kategorie) über die ID-Nummern.
|
Wie kann ein entsprchendes JOIN ausehen? Normalerweise würde ich jetzt sagen,wie sehen die Versuche aus, aber ...
Da in jeder Tabelle eine ID steht, die eindeutig mit den anderen Tabellen verknüpft werden kann:
PHP-Code:
SELECT * FROM Hauptabelle INNER JOIN arbeitsjahr ON Hauptabelle.id = arbeitsjahr.id INNER JOIN sitzung ON Hauptabelle.id = sitzung.id INNER JOIN kategorie ON Hauptabelle.id = kategorie.id WHERE ...
Zitat:
Zitat von mrweasel
Für die Such-Funktion habe ich ein Formular erstellt in welchem ein oder mehrere Werte zur Suche eingegebenen werden können. Die Werte für das Arbeitsjahr, Sitzung und Kategorie können über ein Dropdown-Feld ausgewählt werden. Nun würde ich gerne, wenn das Ergebnis der Suche ausgegebenen wird, dass bei den Feldern wie Arbeitsjahr, ... nicht die ID-Nummern (welche ja in der Haupttabelle stehen) ausgegeben werden, sondern die entsprechende Werte in Worten (welche ja in den Nebentabellen definiert werden) angezeigt werden.
|
Mit der oben angegebenen SELECT werden die Tabellen eindeutig verknüpft, also jeder Datensatz liefert auch nur jeweilig einmal die Felder. Welche Felder aus einem DS angezeigt werden entscheidest Du doch selbst.
Für ein Suchergebnis muss natürlich das gesuchte Wort in die DB-Abfrage übergeben werden:
PHP-Code:
SELECT * FROM Hauptabelle INNER JOIN arbeitsjahr ON Hauptabelle.id = arbeitsjahr.id INNER JOIN sitzung ON Hauptabelle.id = sitzung.id INNER JOIN kategorie ON Hauptabelle.id = kategorie.id WHERE hauptabelle.beschluss like '.$suchwort.' ...
Zum letzten Abschnitt Deines Posts:
Bei einer ID gehe ich davon aus, dass diese einmalig vorkommt, pro Tabelle. Den Rest verstehe ich nicht. Zeig die Tabelle, die Tabellenstruktur oder vesuch es andes zu erklären, ich versteh es nicht!
Grüße, Franzx
__________________
Für die richtige Frage gibt's die richtige Antwort!
|
24.04.2008, 22:17:11
|
|
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)
|
24.04.2008, 23:23:47
|
Junior Member
|
|
Registriert seit: Nov 2005
Ort: Bremen
Beiträge: 437
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Hmmm, ich weis nun nicht worauf Du hinaus willst? Wenn schon die erste Kategorie angegeben ist, spielt es doch keine Rolle ob eine zweite Kategorie angegeben wird. kat2 ist nur ein Feld. Steht da was drin so kann es mit ausgegeben werden und ist es leer wird nichts angezeigt. Deshalb reicht es doch aus nur nach kat1 zu suchen, zumindest um die Datensätze mit Kategorien auszugeben.
Soll die Auswertung auch nach Kategorien statt finden, so muss die Kategorienabfrage in die WHERE Bedingung:
PHP-Code:
... WHERE kat1 = $POST['kat_suchefeld'] OR kat2 = $POST['kat_suchefeld'] ...
Grüße, Franzx
Dein SELECT mit der doppelten Ausgabe der Datensätze, sofern zwie Kategorien angeben sind, kann per GROUP BY ID auf einen DS reduziert werden
__________________
Für die richtige Frage gibt's die richtige Antwort!
Geändert von Franzx (24.04.2008 um 23:27:23 Uhr)
Grund: Erweiterung:
|
27.04.2008, 20:47:08
|
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 5
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Hallo Franzx!
Ich habe zwei Screenshots von einer Abfrage angefertigt. Vielleicht kommen wir dann "einander näher" bei meinem Problem.
Der erste Screenshot zeigt die Ausgabe und die SELECT-Abfrage ohne GROUP BY. Die wichtigen Teile habe ich rot markiert (ID, Kategorien, Ausgabe der Werte der Tabelle "Kategorien"). Wie du siehst bekomme ich für ein und den selben Eintrag in der Haupttabelle zwei Ausgabe-Zeilen. Einmal mit der Wortbezeichnung für die ID-Zahl in kat1 und einmal für kat2. Ich würde aber für die Ausgabe in der HTML-Seite gerne nur eine Zeile bekommen in der beide Bezeichnungen sozusagen nebeneinander aufscheinen.
Im zweiten Screenshot habe ich GROUP BY angewandt. Dann erhalte ich logischerweise jedoch nur mehr den Wert für das Feld kat1, was ich ja nicht möchte bzw. nur die Hälfte der Lösung für mich ist.
Ich denke für die Lösung an eine Relations-/Verknüpfungstabelle (ID_Beschluss und ID_Kategorie wären die zwei Felder und bilden zusammen den Primärschlüssel oder es gibt noch ein eigenes ID-Feld als Primärschlüssel). Nur weiß ich dann nicht wie ich beim Speichern eines neuen Beschlusses die ID dessen - sie wird ja durch auto_increment in der Haupttabelle automatisch angelegt - in die Relationstabelle schreiben kann. Weiters wäre mir dann die Abfrage nicht ganz klar (deine vorhin angegebene Lösung müsste also erweitert werden, leider weiß ich nicht wie).
Vielleicht ist nun durch die Bilder klar geworden worauf ich hinaus will. Hoffe du kannst mir da weiterhelfen?
Danke,
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 (27.04.2008 um 20:55:11 Uhr)
Grund: Satzbau, Links
|
28.04.2008, 00:10:50
|
Junior Member
|
|
Registriert seit: Nov 2005
Ort: Bremen
Beiträge: 437
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Zitat:
Zitat von mrweasel
Hallo Franzx!
Ich habe zwei Screenshots von einer Abfrage angefertigt. Vielleicht kommen wir dann "einander näher" bei meinem Problem.
Der erste Screenshot zeigt die Ausgabe und die SELECT-Abfrage ohne GROUP BY. Die wichtigen Teile habe ich rot markiert (ID, Kategorien, Ausgabe der Werte der Tabelle "Kategorien"). Wie du siehst bekomme ich für ein und den selben Eintrag in der Haupttabelle zwei Ausgabe-Zeilen. Einmal mit der Wortbezeichnung für die ID-Zahl in kat1 und einmal für kat2. Ich würde aber für die Ausgabe in der HTML-Seite gerne nur eine Zeile bekommen in der beide Bezeichnungen sozusagen nebeneinander aufscheinen.
Im zweiten Screenshot habe ich GROUP BY angewandt. Dann erhalte ich logischerweise jedoch nur mehr den Wert für das Feld kat1, was ich ja nicht möchte bzw. nur die Hälfte der Lösung für mich ist.
Ich denke für die Lösung an eine Relations-/Verknüpfungstabelle (ID_Beschluss und ID_Kategorie wären die zwei Felder und bilden zusammen den Primärschlüssel oder es gibt noch ein eigenes ID-Feld als Primärschlüssel). Nur weiß ich dann nicht wie ich beim Speichern eines neuen Beschlusses die ID dessen - sie wird ja durch auto_increment in der Haupttabelle automatisch angelegt - in die Relationstabelle schreiben kann. Weiters wäre mir dann die Abfrage nicht ganz klar (deine vorhin angegebene Lösung müsste also erweitert werden, leider weiß ich nicht wie).
Vielleicht ist nun durch die Bilder klar geworden worauf ich hinaus will. Hoffe du kannst mir da weiterhelfen?
Danke,
mrweasel
|
Ich habe nun verstanden was Du erreichen willst, in diesem Beispiel. Also das Wort Personal und Finanzen sollen hintereinander, als wäre es ein Feld, gelistet werden.
Habe keine Lösung dafür, in MySQL.
Ich löse diese Anforderungen mit Einzelabfragen in PHP und "setzte" diese Ergebnisse in Templates zusammen.
Es tut mir leid, damit bin ich überfordert. Es wäre sicherlich interessant eine Lösung zu finden, schon alleine weil ich es gegenenfalls ja später auch gebrauchen könnte, doch der Zeitaufwand ist für mich derzeit nicht leistbar.
Grüße, Franz
__________________
Für die richtige Frage gibt's die richtige Antwort!
|
28.04.2008, 19:25:10
|
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 5
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Na wenigstens habe ich es geschafft mein Problem verständlich zu erklären.
Schade, aber da kann man nichts machen.
Weißt du an wen oder wohin ich mich sonst wenden könnte?
__________________
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.
|
28.04.2008, 20:37:44
|
Junior Member
|
|
Registriert seit: Nov 2005
Ort: Bremen
Beiträge: 437
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Zitat:
Zitat von mrweasel
Na wenigstens habe ich es geschafft mein Problem verständlich zu erklären.
Schade, aber da kann man nichts machen.
Weißt du an wen oder wohin ich mich sonst wenden könnte?
|
Du bist schon richtig hier! Hier im Forum bewegen sich auch noch echte MySql-Profis, die gegebenenfalls noch andere Lösungsansätze liefern könnten!
Viel Erfolg und Grüße aus Bremen,
Franz
__________________
Für die richtige Frage gibt's die richtige Antwort!
|
05.05.2008, 20:54:19
|
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 5
|
|
AW: Frage zur Verknüpfung v. Tabellen in SELECT und Datenbankstruktur
Leider habe ich im deutschen MySQL-Forum auf mein Problem noch keine Antwort bekommen.
Ich habe jetzt einmal versucht mit der MySQL-Fkt. last_insert_id() aus der Haupttabelle die letzte gespeicherte ID zu bekommen, sodass ich damit die Relationstabelle bei einem neuen Eintrag füttern kann. Nur leider gibt mir diese ID nur mehr oder weniger die Anzahl der in der Haupttabelle vorhandenen IDs zurück und nicht die wirklich letzte ID. Zum Beispiel gibt es in der Haupttabelle 10 DS, die letzte ID ist also 10. Ich lösche nun 2 der vorhandenen DS - die Fkt. last_insert_id() gibt nun 8 zurück und nicht 10.
Damit kann ich also mein Problem auch nicht lösen.
Vielleicht ist inzwischen jemand anderem eine mögliche Lösung zu meinen zwei Fragen (siehe Beitrag-Nr. 5)?
Danke und schöne Grüße
mrweasel
<edit>
im MySQL-Forum hat mir jemand eine Möglichkeit mit Subselects gezeigt. So hole ich mir die entsprechenden Werte aus der Tabelle "bbdb_kategorie" einfach mit zwei Subselects und habe sie somit für die Ausgabe in einer Zeile.
Hätte zwar gestern sehr spät noch herausgefunden wie LAST_INSERT_ID() (-> http://forums.mysql.com/read.php?12,2060,3853) doch funktioniert (oder auch mysql_insert_id()) und eine gute Anleitung für den Mehrfachjoin, aber so erfüllt mein SQL-Query auch seine Zwecke.
Danke nochmals für die Hilfe, Franz (-:
__________________
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 (06.05.2008 um 22:44:19 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:49:07 Uhr.
|