php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.01.2009, 11:50  
Erfahrener Benutzer
 
Registriert seit: 06.01.2009
Beiträge: 144
likemike90 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] MYSQL Beziehung

Hallo

Meine Name ist Michael bin 18 Jahre alt und neu hier in den Forum, habe vor paar Wochen angefangen mich für PHP / MYSQL zu interessieren und stoße nun hier erstmal auf ein gröberes Problem.

Ich habe ein kleines Script gebastelt zum einpflegen von Artikeln
hier kommt meine erste MYSQL Tabelle ins Spiel:

Tabelle Artikel
ID
Artname
Preis
Beschreibung

jetzt möchte ich jeden Artikel eine bzw. auch 2 Kategorien zu ordnen
habe dazu eine zweite Tabelle erstellt

Tabelle Kategorie
ID
Kategorie

Jetzt die Frage wie muss die Tabelle Kategorie und Artikel wirklich aussehen damit ich eine sinnvolle Beziehung aufbauen kann bzw. Sie verbinden kann und wie lautet dazu der dazugehörige Code ?

Wäre Super wenn ihr mir da weiterhelfen könnt

MFG
Mike
likemike90 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.01.2009, 11:55  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

Du möchtest eine n:m Beziehung auflösen daher brauchst Du eine Zwischentabelle, die die Zuordnungen der Artikel ID zur kategorie ID beinhaltet also so etwas in der Form:
Tabelle artikel2kategorie
art_id
kat_id
HPR1974 ist offline   Mit Zitat antworten
Alt 06.01.2009, 12:00  
Erfahrener Benutzer
 
Registriert seit: 06.01.2009
Beiträge: 144
likemike90 befindet sich auf einem aufstrebenden Ast
Standard

Mh das ist für mich alles schwer verständlich gibts vielleicht leicht zu verstehende tutorials für dieses Thema

Beziehungsweise könntest du denn Code mal für mich auflösen und mir den in dem Fall zutreffen SQL Code schreiben ?
likemike90 ist offline   Mit Zitat antworten
Alt 06.01.2009, 12:05  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

Das Thema ist auflösen einer m:n Beziehung. Dafür gibts sicher Tutorials en masse
Den Code musst Du Dir schon selbst erarbeiten. Wenn Du einen Anstz hast und auf Probleme stösst wirst du sicher gute Hilfe finedn.
HPR1974 ist offline   Mit Zitat antworten
Alt 06.01.2009, 12:20  
Erfahrener Benutzer
 
Registriert seit: 06.01.2009
Beiträge: 144
likemike90 befindet sich auf einem aufstrebenden Ast
Standard

ok also hab da eine seite gefunden die nur sperrlich auf das thema eingeht und habe vielleicht eine Lösung kannst du mir sahcen obs vielleicht so geht


Tabelle Kategorie:
id,
name

Tabelle Artikel:
ID,
Artname,
Beschreibung,
Preis,
kategorie1,
kategorie2

Wobei in kategorie1/2 nur die ID der Kategorie steht.
likemike90 ist offline   Mit Zitat antworten
Alt 06.01.2009, 12:40  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von likemike90 Beitrag anzeigen

...
kategorie1,
kategorie2

Wobei in kategorie1/2 nur die ID der Kategorie steht.
Das ist Quatsch, was ist dann, wenn ein Artikel plötzlich in einer dritten Kategorie erscheinen soll? HPR1974 hat dir ja schon geschrieben, dass du eine zusätzliche Tabelle brauchst. Diese besteht nur aus den Primärschlüsseln der beiden anderen Tabellen.

Tabelle Kategorie:
id, // Primärschlüssel
name

Tabelle Artikel:
id, // Primärschlüssel
artname,
beschreibung,
breis

Tabelle ArtikelKategorie
art_id, // Fremdschlüssel
kat_id // Fremdschlüssel
Die beiden id's bilden dann gemeinsam den Primärschlüssel.
Hier findest du eine kurze Beschreibung des entsprechenden Datenbank-Designs
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 06.01.2009, 12:45  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Möglich, aber dann bist Du auf zwei Kategorien festgelegt (oder Du musst die Tabelle jedes Mal ändern, wenn Du doch mehr Kategorien benötigst).
Wenn Du noch eine dritte Tabelle einführst, kannst Du einem Artikel beliebig viele Kategorien zuordnen (und umgekehrt).
Code:
CREATE TABLE "kategorien" (
  "id" int(10) unsigned NOT NULL auto_increment,
  "name" varchar(50) NOT NULL,
  PRIMARY KEY  ("id")
);

CREATE TABLE "artikel" (
  "id" int(10) unsigned NOT NULL auto_increment,
  "name" varchar(50) NOT NULL,
  "beschreibung" varchar(50) NOT NULL,
  "preis" decimal(10,2) unsigned NOT NULL,
  PRIMARY KEY  ("id")
);

CREATE TABLE "artikelkategorien" (
  "id_artikel" int(10) unsigned NOT NULL,
  "id_kategorie" int(10) unsigned NOT NULL,
  PRIMARY KEY  ("id_artikel","id_kategorie")
);
edit: ja, genau der selbe Vorschlag wie von lazydog ...nur langsamer.
David ist offline   Mit Zitat antworten
Alt 06.01.2009, 12:56  
Erfahrener Benutzer
 
Registriert seit: 06.01.2009
Beiträge: 144
likemike90 befindet sich auf einem aufstrebenden Ast
Standard

Ok Super die Seite hat mir wirklich weitergeholfen, aber das wars ja noch nicht also hab das mal so gemacht wie david und lazydog gezeigt hat aber jetzt muss ich ja noch irgendwie eine verbindung zwischen den tabellen herbekommen...

has du zu den thema auch eine hilfreiche seite , weil hab hier nichts sinnvolles gefunden was das left join und soweiter in therorie erklärt .
likemike90 ist offline   Mit Zitat antworten
Alt 06.01.2009, 13:01  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

peter kropffs seite
HPR1974 ist offline   Mit Zitat antworten
Alt 06.01.2009, 13:27  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Nehmen wir mal an, Du hast die Datensätze
Code:
INSERT INTO kategorien (id, name) VALUES
  (1, "Kat A"),
  (2, "Kat B");

INSERT INTO artikel (id, name, beschreibung, preis) VALUES
  (1, "Artikel X", "...", 10),
  (2, "Artikel Y", "...", 20);

INSERT INTO artikelkategorien (id_artikel, id_kategorie) VALUES
  (1, 1),
  (1, 2),
  (2, 2)
Artikel X gehört also zur Kategorie "Kat A" und zur Kategorie "Kat B", Artikel Y nur zur Kategorie "Kat B".

Die Verbindung stellst Du per JOIN her.
Erstmal die "Basisabfrage"
Code:
SELECT
  *
FROM
  artikel
Das "erzeugt" als (internes) Ergebnis Datensätze mit den Felder id, name, beschreibung, preis aus der Tabelle Artikel.
Jetzt kommt der "magische Teil"
Code:
SELECT
  *
FROM
  artikel
JOIN
  artikelkategorien
ON
  artikel.id =  artikelkategorien.id_artikel
Für jeden Datensatz, den MySQL für die Tabelle artikel produziert (hier: alle Datensätze in artikel), geht es die Datensätze in artikelkategorien durch und vergleicht artikel.id = artikelkategorien.id_artikel. Wenn das passt, wird im Ergebnis ein neuer Datensatz mit den Feldern aus artikel und artikelkategorien zusammengebaut, mit den Werten der beiden zueinander passenden Datensätze - für jeden passenden Datensatz aus artikelkategorien.

Erster Datensatz aus artikel: (artikel.id=1, "Artikel X", "...", 10)
Wird vergleichen mit (artikel_id=1, 1), passt, Ergebnis (artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=1)
Wird vergleichen mit (artikel_id=1, 2), passt, Ergebnis (artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=2)
Wird vergleichen mit (artikel_id=2, 1), passt nicht, Datensatz fliegt raus
Zweiter Datensatz aus artikel: (artikel.id=2, "Artikel Y", "...", 20)
Wird vergleichen mit (artikel_id=1, 1), passt nicht
Wird vergleichen mit (artikel_id=1, 2), passt nicht
Wird vergleichen mit (artikel_id=2, 2), passt, Ergebnis (artikel.id=2, "Artikel Y", "...", 10, artikel_id=2, kategorie_id=2)
Das (interne) Ergbnis sieht also so aus:
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=1)
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=2)
(artikel.id=2, "Artikel Y", "...", 10, artikel_id=2, kategorie_id=2)
- Erstmal sacken lassen -


Das sind auch wieder Datensätze (jedenfalls kann man sie als solche betrachten), nennen wir sie "Zwischenergebnis".
Und die kann man wieder über JOIN mit anderen Datensätzen verknüpfen
Code:
SELECT
  *
FROM
  artikel
JOIN
  artikelkategorien
ON
  artikel.id =  artikelkategorien.id_artikel
JOIN
  kategorien
ON
  kategorien.id = artikelkategorien.id_kategorie
MySQL "nimmt" jetzt also die drei Zwischenergebnisse aus der ersten Verknüpfung und vergleicht sie gegen die Tabelle kategorien.

Vergleiche für das erste Zwischenergebnis:
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=1) und (1, "Kat A") passt.
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=1) und (2, "Kat B") passt nicht.
Vergleiche für das zweite Zwischenergebnis:
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=2) und (1, "Kat A") passt nicht.
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=2) und (2, "Kat B") passt.
Vergleiche für das dritte Zwischenergebnis:
(artikel.id=2, "Artikel Y", "...", 10, artikel_id=2, kategorie_id=2) und (1, "Kat A") passt nicht.
(artikel.id=2, "Artikel Y", "...", 10, artikel_id=2, kategorie_id=2) und (2, "Kat B") passt.
Ergebnis:
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=1, kategorien.id=1, kategorien.name="Kat A")
(artikel.id=1, "Artikel X", "...", 10, artikel_id=1, kategorie_id=2, kategorien.id=2, kategorien.name="Kat B")
(artikel.id=2, "Artikel Y", "...", 10, artikel_id=2, kategorie_id=2, kategorien.id=2, kategorien.name="Kat B")

Aus diesem internen Ergebnis kannst Du dann diejenigen Felder auswählen, die Dir MySQL liefern soll
Code:
SELECT
  artikel.id, artikel.name, artikel.beschreibung, artikel.preis,
  kategorien.name
FROM
  artikel
JOIN
  artikelkategorien
ON
  artikel.id =  artikelkategorien.id_artikel
JOIN
  kategorien
ON
  kategorien.id = artikelkategorien.id_kategorie

Geändert von David (06.01.2009 um 13:31 Uhr).
David ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
GUI-Tool kann sich nicht mit MySql verbinden KWitt72 PHP Tipps 2008 3 21.12.2008 16:56
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
MySQL in PHP integrieren (Windows 2003 Server ohne Apache) Plague Server, Hosting und Workstations 3 30.08.2007 21:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
PHP 5.1.2 mySQL 5.0.19 MS-SQL 2005 IIS 6.0 Shakaar PHP-Fortgeschrittene 10 26.03.2006 22:23
Kein Zugriff über ODBC mit der IP-Adresse auf MySql DB Datenbanken 4 09.02.2006 11:04
[Erledigt] Zu blöd um MySQL in PHP einzurichten? Apache Server PHP Tipps 2006 18 30.01.2006 23:39
[Erledigt] Mysql 4.1.x unter php 4.3.9 Datenbanken 3 15.11.2005 13:49
Schnittstelle zwischen PHP und MySQL klappt net !!! Datenbanken 16 16.10.2005 14:24
[Erledigt] not allowed to connect to this MySQL server PHP Tipps 2005-2 2 23.09.2005 18:34
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
Access denied for user: '@localhost' / SYSTEM@localhost Datenbanken 0 10.11.2004 20:35
[Erledigt] PHP5 &a m p; MySQL Datenbanken 5 01.08.2004 05:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql interne beziehungen, mysql interne beziehung, mysql beziehung, interne beziehungen mysql, mysql tabellen beziehungen, mysql interne beziehung nicht zu primary, php mysql beziehungen, mysql n m auflösen, mysql beziehungen, mysql beziehung php, mysql join mit n zu m beziehungen, php mysql beziehung, mysql zwischenergebnis, mysql datenbank beziehungen php, mysql beziehungen aufbauen, php mysql interne beziehungen, auflösung n:m beziehung mysql, mysql n:m, mysql datenbank beziehungen, mysql n:m beziehung

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:08 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum