Antworten auf deine Fragen:
Neues Thema erstellen

mehrere bedingungen mysql

kaltmacher

Nikon-Fan

hallo,

ich möchte insgesamt 4 Bedingungen in meine sql-syntax einbauen, leider aber schreibt er mir immer eine fehlermeldung. :-(

Folgende Problematik:
Fotoseite, mehrere Fotografen, jeder hat Bilder in der Datenbank mit seinem Namen (Feld Autor). Man kann mehrere Kategorien beim Uploaden der Bilder angeben (3 Stück) und diese werden in der Datenbank vermerkt.

Nun möchte ich die Bilder ausgeben, aber sortiert nach Kategorie XYZ und von Autor ABC.

So sieht meine bisherige Syntax aus:

Code:
$sql = "SELECT * FROM bilder WHERE autor='ABC', kategorie1=\'".$kategorie."\' OR kategorie2=\'".$kategorie."\' OR kategorie3=\'".$kategorie."\' ORDER BY bildnr DESC LIMIT 0,50";

Kategorie wird vorher übergeben.
Was mache ich falsch? :-( Blicke beim manual nicht durch, entweder nur eine Bedingung oder eine sehr einfache, wo nur eine Uhrzeit oder ein Datum verglichen wird. :(

gruß Km
 

netbandit

Aktives Mitglied

AW: mehrere bedingungen mysql

Hast beim Anlegen der Datenbank schon einen Denkfehler. Für jede Kategorie eine Spalte anlegen ist nicht so gut, sortierung ist da mehr als umständlich. Entweder nur eine Spalte und dort die Kategorie eintragen, oder sofern mehrere Kategorien zutreffen können, eine extra Tabelle Kategorie anlegen und mit Joins arbeiten.
 

kaltmacher

Nikon-Fan

AW: mehrere bedingungen mysql

hm, was ist aber, wenn Bild nicht in eine Kategorie einzuordnen ist? 2 Einträge in die extra-Tabelle Kategorie?

gruß kM
 

Duddle

Posting-Frequenz: 14µHz

AW: mehrere bedingungen mysql

Wenn ein Objekt keine Kategorie hat, dann hat es eben ein NULL in der Kategorie-Spalte. Das ist sogar hilfreich, da du dann sehr einfach Abfragen alá "welches Bild hat keine Kategorie?" durchführen kannst.
Ich stimme netbandit zu: du hast einen Entwurfsfehler gemacht (und ich glaube das ist nicht das erste Mal, dass ich das zu dir sage iirc?). Da du aber scheinbar noch im Entwicklungsstadium bist, solltest du den Fehler jetzt beheben und von Beginn an sauber arbeiten, statt danach (wie in der ersten Frage schon deutlich) unnötig rumschustern zu müssen.

Edit: wenn ich dich richtig verstanden habe, hat jedes Bild viele Kategorien und jede Kategorie kann vielen Bildern zugeordnet werden? n:m-Beziehung, wird umgesetzt mit ner Hilfstabelle.

Duddle
 
Zuletzt bearbeitet:

kaltmacher

Nikon-Fan

AW: mehrere bedingungen mysql

@duddle:

im iirc haben wir uns noch nicht gesprochen, was nicht ist, kann aber noch werden. ;)

Ja, bin bei mysql immernoch totaler Anfänger, habe es bisher immer nur als normalen Datenspeicher genutzt und mit einfachen abfragen gefüttert. Möchte mich in diesem Gebiet aber noch ein wenig weiterentwickeln.

Also rätst du auch dazu, eine Hilftabelle anzulegen. Wie müsste ich diese dann, bei drei kategorien, beschreiben? Für jede Kategorie welche einen Wert besitzt, einen neuen Datensatz? Also bei 2 vollständigen Kategorien:

KatBildnr -> Bildnr 52 -> Kategorie ABC
KatBildnr -> Bildnr 52 -> Kategorie DEF


Klingt logisch.
Ich versuche mir immer auf Papier meine Tabellen, und dementsprechende Felder, schon sehr detailliert aufzumalen/konstruieren, aber während dem Arbeiten in php muss ich dann ab und an neue Felder hinzufügen.

Gibt es da Tips, soetwas zu vermeiden?
gruß kM
 
Zuletzt bearbeitet:

r3nt5ch3r

~ Allround pG ~

AW: mehrere bedingungen mysql

Nö! Ein Datenbankentwurf ist genau so flexibel wie Quellcode (der wird beim ersten mal auch nicht perfekt sein)
Interessant für dich aber schon etwas kompliziert: http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

Datenbank sähe so ca aus:
Tabelle Bild (Bild nicht Bilder! Immer in Einzahl^^):
bildId INT
autorId INT (Referenz zu einer User-Tabelle über die UserId, außer du willst dass Gäste auch was eintragen können, dann würd ich hier zusätzlich einen autorUsername hinzufügen. Sofern er also registriert ist wird die id benutzt, falls nicht der username)
bildPfad varchar(200)
...

Tabelle Kategorie:
kategorieId INT
bildId INT (Referenz zu Bild-Tabelle über bildId)
kategorieName varchar(200)

-Attribut-Verknüpfungen über mehre Tabellen sollten gleich heißen (zb "bildId")!
Ein Beispiel sähe dann so aus:
1x Eintrag in Bild (von oben nach unten): (1, 2, 'blaa.jpg')
2x Einträge in Kategorie:
- (1, 1, 'Menschen')
- (2, 1, 'Pflanzen')
so hätte das Bild mit der Id:1 nun die 2 Kategorien zugeordnet; der autor des Bildes wäre der User mit der userId:2 usw^^. Somit ist der ganze Entwurf auch weitaus flexibler (es können theoretisch unendlich Kategorien einem Bild zugeordnet werden oder auch keine)

sooo ich weiß zwar dass ich dich damit überrumpel, aber mir is grad langweilig sryy xD
 

Duddle

Posting-Frequenz: 14µHz

AW: mehrere bedingungen mysql

Tabelle Kategorie:
kategorieId INT
bildId INT (Referenz zu Bild-Tabelle über bildId)
kategorieName varchar(200)

Der Entwurf ist nicht redundanzfrei (siehe auch 2.NF), Stichwort Änderungsinkonsistenz. Wie gesagt, eine n:m-Beziehung wird i.d.R. über eine Hilfstabelle zwischen den zu verknüpfenden Tabellen realisiert. Heisst konkret:

  • eine Tabelle "Bilder" mit mindestens einer eindeutigen id, z.B. bild_id
  • eine Tabelle "Kategorien" mit mindestens einer eindeutigen id, z.B. kategorie_id
  • eine Tabelle, die die Zuordnung darstellt, z.b. "BilderKategorieZuordnung" mit bild_id und kategorie_id als Fremdschlüssel; als Primärschlüssel entweder noch ne id einführen oder einen compound über kategorie_id und bild_id legen, das sollte in dem Fall auch eindeutig sein

Beispiele in BilderKategorieZuordnung wären dann (5, 8), (3, 8), (5, 2), also hätte das Bild mit der id 5 zwei Kategorien, und zwar (die ids) 8 und 2. Bild 3 hätte dann noch Kategorie 8. Was sich hinter den ids versteckt, zeigt dann natürlich ein JOIN.



Duddle
 

kaltmacher

Nikon-Fan

AW: mehrere bedingungen mysql

@r3nt5ch3r: nene, komm ich recht gut mit. :)

Soweit versteh ich das ganz gut, nur meine Frage ist: wenn ich via php eine Eingabe mache, dann muss ich jede dieser Hilfs- und Haupttabellen mit Daten befüllen?

Oder verhält es sich dann so, dass die Hilfstabelle automatisch mit befüllt wird, wenn ein neuer Datensatz in der Haupttabelle "bild" erstellt wird?
Und sehe ich das richtig, dass die Hilfstabelle dann beide Primärschlüssel (kategorie_id und bild_id) eingetragen bekommt? Muss ich dann auch in der Hilfstabelle beide Schlüssel primär machen?

gruß kM
 

r3nt5ch3r

~ Allround pG ~

AW: mehrere bedingungen mysql

*autsch* thx @ duddle (war schon recht spät/früh)

Code:
CREATE TABLE `bild` (
`bildId` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
`userId` INT(11) UNSIGNED NOT NULL ,
`bildPfad` VARCHAR(200) NOT NULL ,
PRIMARY KEY (`bildId`))
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `kategorie` (
`kategorieId` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
`kategorieName` VARCHAR(200) NOT NULL ,
PRIMARY KEY (`kategorieId`))
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `bild_to_kategorie` (
`bildId` INT(11) UNSIGNED NOT NULL ,
`kategorieId` INT(11) UNSIGNED NOT NULL
)
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

@kaltmacher vergess das ganze von heut morgen^^

Soweit versteh ich das ganz gut, nur meine Frage ist: wenn ich via php eine Eingabe mache, dann muss ich jede dieser Hilfs- und Haupttabellen mit Daten befüllen?

Ja

Oder verhält es sich dann so, dass die Hilfstabelle automatisch mit befüllt wird, wenn ein neuer Datensatz in der Haupttabelle "bild" erstellt wird?

Nein (Sql kann leider nocht nicht hellsehen :D)

Und sehe ich das richtig, dass die Hilfstabelle dann beide Primärschlüssel (kategorie_id und bild_id) eingetragen bekommt? Muss ich dann auch in der Hilfstabelle beide Schlüssel primär machen?

Ein Primärschlüssel ist einzigartig, daher können diese beiden kein Primärschlüssel sein, da ein Bild mehrere Kategorien haben kann und auch eine Kategorie mehrere Bilder (siehe Sql Code).
 
Zuletzt bearbeitet:

Duddle

Posting-Frequenz: 14µHz

AW: mehrere bedingungen mysql

Da aber jede Tabelle einen Primärschlüssel ... okay, nicht braucht, aber sehr gerne hätte, solltest du wie gesagt noch einen solchen einführen. Entweder über eine zusätzliche Spalte, oder indem du bildId mit kategorieId (aus r3nt...s Vorschlag) als compound primary key festlegst.

Ein Bild kann ja nicht zwei mal die gleiche Kategorie haben (oder? wenn doch, dann brauchst du auf jeden Fall eine extra Spalte), deshalb wäre ein compound key eindeutig.


Duddle
 

MaggyMB

Anfänger

AW: mehrere bedingungen mysql

Warum so kompliziert? Mach doch einfach zwei Tabellen:
Code:
CREATE TABLE `Bild` (
`BildID` INT(10) UNSIGNED NOT_NULL AUTO_INCREMENT,
`UserID` INT(10) UNSIGNED NOT_NULL,
`BildKatgegorie` INT(10) UNSIGNED NOT_NULL,
`BildPfad` VARCHAR(200) NOT_NULL,
PRIMARY_KEY(BildID))

CREATE TABLE `Kategorie` (
`ID` INT(10) UNSIGNED NOT_NULL AUTO_INCREMENT,
`Name` VARCHAR(100) NOT_NULL,
PRIMARY_KEY(ID))
So würde ichs machen. Wenn ein Bild mehrere Kategorien hat trägt dein Script halt jede Zahl ein, wenn du mehr als neun Kategorien hast musst du die Zahlen halt per Strichpunkt oder sonstwelche Zeichen trennen.
Gruß Maggy
 

Duddle

Posting-Frequenz: 14µHz

AW: mehrere bedingungen mysql

trägt dein Script halt jede Zahl ein

Wo?

wenn du mehr als neun Kategorien hast musst du die Zahlen halt per Strichpunkt oder sonstwelche Zeichen trennen

In welchem Feld soll das stehen? Nur 'Bildpfad' und 'Name' würden nicht-numerische Zeichen vertragen, aber die haben ja nicht wirklich was mit der Zuordnung von Bild und Kategorie zu tun.


Duddle
 

MaggyMB

Anfänger

AW: mehrere bedingungen mysql

In welchem Feld soll das stehen? Nur 'Bildpfad' und 'Name' würden nicht-numerische Zeichen vertragen, aber die haben ja nicht wirklich was mit der Zuordnung von Bild und Kategorie zu tun.
Ok daran hab ich nicht gedacht:uhm: Ich persönlich benutz halt lieber weniger Tabellen weil ichs übersichtlicher find aber in dem Fall hör lieber auf die Leute die mehr Ahnung haben;)
Gruß Maggy
 

saila

Moderatorle

AW: mehrere bedingungen mysql

Ok daran hab ich nicht gedacht:uhm: Ich persönlich benutz halt lieber weniger Tabellen weil ichs übersichtlicher find aber in dem Fall hör lieber auf die Leute die mehr Ahnung haben;)
Gruß Maggy
Der Gedankenansatz mag ja schon was für sich haben, aber letztlich nimmst du dir mit weniger Tabellen auch eine Grundflexibilität. Durch die Vorschläge hier eröffnen sich ja letztlich auch ganz andere Aspekte im späteren handling. Z.B. Statistikdaten, Fotografenverwaltung usw. usw.. Darüber hinaus ist es auch jederzeit möglich bei redundanten Tabellen neue Tabellen hinzuzufügen, welche wiederum in Abhängigkeit stehen können/müssen.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.065
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben