php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.01.2012, 14:19  
Erfahrener Benutzer
 
Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse:
Anfänger
Buschdieb
Standard [Erledigt] Datenbankabfrage MYSQL Strukturproblem INNER JOIN

Hallo Leute,

ich habe ein Problem bei dem ich euren Rat benötige. Irgendwie stehe ich auf dem Schlauch.

Ich habe eine PHP und MYSQL Anwendung.

Tabellen: Projekte, Kunden, Company, company_rechte, User

Tabelle Projekte (p) ist wie folgt aufgebaut.
- p.id, p.vg, p.pg
vg = Vertriebsfirma
pg =Produktionsfirma

Tabelle Company (c) ist wie folgt aufgebaut.
- c.id, c.name, c.vg(1||0), c.pg(1||0)

Tabelle User (u) ist wie folgt aufgebaut.
- u.uid, name usw.

Tabelle company_rechte (cr) ist wie folgt aufgebaut.
- cr.cid, u.uid

Tabelle Kunden (k) ist eher zu vernachlässigen.
- k.kid, k.name usw.

Nun habe ich eine Abfrage geschrieben mit INNER JOIN die mir alle Projekte anzeigt eines User anzeigt der das Recht hat die VG (Vertriebsfirma) aufzurufen. Die Abfrage sieht wie folgt aus.

Code:
SELECT p.id, p.vg, p.pg
FROM projekte p
INNER JOIN kunden k
ON p.kid = k.kid
INNER JOIN company c 
ON c.id = p.vg
INNER JOIN company_rechte cr
ON cr.cid = c.id
INNER JOIN user u
ON cr.uid = u.uid
WHERE cr.uid = 1
Das Ziel ist alle Projekte anzeigen zu lassen auf das der User zugreifen darf. Er muss mindestens einer Firmenkategorie (Vertrieb und / oder Produktion) zugeordnet sein. Anscheinend sehe ich den Wald vor lauter Bäumen nicht mehr und wäre über einen guten Tipp sehr dankbar!

Sobald ich INNER JOIN company c ändere bekomme ich doppelte Datensätze.

Code:
INNER JOIN company c ON c.id = p.vg or c.id = p.pg
Herzlichen Dank!

Gruß
Buschdieb
__________________
fragen ist kostenlos!

Buschdieb.com
Buschdieb ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 13.01.2012, 18:40  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Buschdieb Beitrag anzeigen
Hallo Leute,

ich habe ein Problem bei dem ich euren Rat benötige. Irgendwie stehe ich auf dem Schlauch.

Ich habe eine PHP und MYSQL Anwendung.

Tabellen: Projekte, Kunden, Company, company_rechte, User

Tabelle Projekte (p) ist wie folgt aufgebaut.
- p.id, p.vg, p.pg
vg = Vertriebsfirma
pg =Produktionsfirma

Tabelle Company (c) ist wie folgt aufgebaut.
- c.id, c.name, c.vg(1||0), c.pg(1||0)

Tabelle User (u) ist wie folgt aufgebaut.
- u.uid, name usw.

Tabelle company_rechte (cr) ist wie folgt aufgebaut.
- cr.cid, u.uid

Tabelle Kunden (k) ist eher zu vernachlässigen.
- k.kid, k.name usw.

Nun habe ich eine Abfrage geschrieben mit INNER JOIN die mir alle Projekte anzeigt eines User anzeigt der das Recht hat die VG (Vertriebsfirma) aufzurufen. Die Abfrage sieht wie folgt aus.

Code:
SELECT p.id, p.vg, p.pg
FROM projekte p
INNER JOIN kunden k
ON p.kid = k.kid
INNER JOIN company c 
ON c.id = p.vg
INNER JOIN company_rechte cr
ON cr.cid = c.id
INNER JOIN user u
ON cr.uid = u.uid
WHERE cr.uid = 1
Das Ziel ist alle Projekte anzeigen zu lassen auf das der User zugreifen darf. Er muss mindestens einer Firmenkategorie (Vertrieb und / oder Produktion) zugeordnet sein. Anscheinend sehe ich den Wald vor lauter Bäumen nicht mehr und wäre über einen guten Tipp sehr dankbar!

Sobald ich INNER JOIN company c ändere bekomme ich doppelte Datensätze.

Code:
INNER JOIN company c ON c.id = p.vg or c.id = p.pg
Herzlichen Dank!

Gruß
Buschdieb

Entweder übersehe ich es, oder es fehlt: wie und wo ist definiert, was ein User darf?

Vielleicht erklärst Du mal (anhand konkreter Tabellen, deren Definition und Beispieldaten), was Du erreichen willst.


Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 13.01.2012, 18:55  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von akretschmer Beitrag anzeigen
Entweder übersehe ich es, oder es fehlt: wie und wo ist definiert, was ein User darf?
In der Tat.

Mein Tip wäre das:
10.4.5. The SET Type
http://dev.mysql.com/doc/refman/5.0/en/set.html

Damit könntest Du 64 unterschiedliche Rechte definieren, die mit der MySQL Funktion find_in_set(Nadel, Heuhaufen) abgefragt werden können.
  Mit Zitat antworten
Alt 13.01.2012, 21:51  
Erfahrener Benutzer
 
Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse:
Anfänger
Buschdieb
Standard

Zitat:
Zitat von akretschmer Beitrag anzeigen
Entweder übersehe ich es, oder es fehlt: wie und wo ist definiert, was ein User darf?
Vielleicht erklärst Du mal (anhand konkreter Tabellen, deren Definition und Beispieldaten), was Du erreichen willst.
Andreas
Zitat:
Zitat von meikel Beitrag anzeigen
In der Tat.

Mein Tip wäre das:
10.4.5. The SET Type
http://dev.mysql.com/doc/refman/5.0/en/set.html

Damit könntest Du 64 unterschiedliche Rechte definieren, die mit der MySQL Funktion find_in_set(Nadel, Heuhaufen) abgefragt werden können.
Hallo vielen Dank für eure Unterstützung!

In company_rechte sind die Firmen und die dazugehörigen User eingetragen.

Tabelle company_rechte (cr) ist wie folgt aufgebaut.
- cr.cid, cr.uid

cr.cid = company id <<--- kommt aus Tabelle Company
cr.uid = user id <<--- kommt aus Tabelle User

Beispiel:

Max Mustermann ist User Nr. 1 (User) und gehört den Firmen (company) A und D an. A ist ein Vertriebsunternehmen und D ein Produktionsunternehmen (company_rechte). Das Unternehmen A verkauft ein Projekt, die Zuordnung findet über vg in Projekte statt. In Projekte wird auch die Firma D als Produktionsunternehmen definiert über die Spalte pg (Projekte). Nun soll Max Mustermann das Projekt sehen können weil er zu einem der beiden Firmen gehört. Richtige Beispieldaten (SQL Anweisungen) liefere ich euch morgen.
__________________
fragen ist kostenlos!

Buschdieb.com
Buschdieb ist offline   Mit Zitat antworten
Alt 15.01.2012, 09:47  
Erfahrener Benutzer
 
Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse:
Anfänger
Buschdieb
Standard

Hallo Leute,

wie angekündigt hier nun meine Beispieldaten.

Zitat:
Zitat von Buschdieb Beitrag anzeigen
Richtige Beispieldaten (SQL Anweisungen) liefere ich euch morgen.
Code:
-- 
-- company --
-- 

CREATE TABLE `company` (
  `id` int(7) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `vg` int(1) NOT NULL,
  `pg` int(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `company` (`id`, `name`,`vg`, `pg`) VALUES 
(1, 'CompanyA',1, 0),
(2, 'CompanyB',0, 1),
(3, 'CompanyC',1, 1)

-- 
-- company_rechte --
-- 

CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)


INSERT INTO `company` (`cid`, `uid`) VALUES 
(1, 1,),
(2, 1,),
(3, 1,),
(1, 2,),
(2, 2,),
(3, 3,)

-- 
-- projekte --
-- 

CREATE TABLE `projekte` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  `vg` int(1) NOT NULL COMMENT 'Vertriebsfirma',
  `pg` int(1) NOT NULL COMMENT 'Produktionsfirma',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES 
(1, 'Projekt1', 1, 2, 1),
(2, 'Projekt2', 1, 3, 1),
(3, 'Projekt3', 3, 3, 2),
(4, 'Projekt1', 3, 2, 3)

-- 
-- kunden --
-- 

CREATE TABLE `kunden` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `kunden` (`id`, `name`) VALUES 
(1, 'Kunde1'),
(2, 'Kunde2'),
(3, 'Kunde3'),
(4, 'Kunde4')
__________________
fragen ist kostenlos!

Buschdieb.com
Buschdieb ist offline   Mit Zitat antworten
Alt 15.01.2012, 17:51  
Erfahrener Benutzer
 
Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse:
Anfänger
Buschdieb
Standard

Ich hatte in der Tabelle company_rechte und projekte einen Fehler. Hier nochmal die Tabellen Daten.

Code:
-- 
-- company --
-- 

CREATE TABLE `company` (
  `id` int(7) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `vg` int(1) NOT NULL,
  `pg` int(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `company` (`id`, `name`,`vg`, `pg`) VALUES 
(1, 'CompanyA',1, 0),
(2, 'CompanyB',0, 1),
(3, 'CompanyC',1, 1)

-- 
-- company_rechte --
-- 

CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)


INSERT INTO `company_rechte` (`cid`, `uid`) VALUES 
(1, 1,),
(2, 1,),
(3, 1,),
(1, 2,),
(2, 2,),
(3, 3,)

-- 
-- projekte --
-- 

CREATE TABLE `projekte` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  `vg` int(1) NOT NULL COMMENT 'Vertriebsfirma',
  `pg` int(1) NOT NULL COMMENT 'Produktionsfirma',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES 
(1, 'Projekt1', 1, 2, 1),
(2, 'Projekt2', 1, 3, 1),
(3, 'Projekt3', 3, 3, 2),
(4, 'Projekt4', 3, 2, 3)

-- 
-- kunden --
-- 

CREATE TABLE `kunden` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `kunden` (`id`, `name`) VALUES 
(1, 'Kunde1'),
(2, 'Kunde2'),
(3, 'Kunde3'),
(4, 'Kunde4')
Hier das Ziel der SELECT Anweisung von oben. Nur mit der INNER JOIn Verknüpfung VG (Vertriebsfirma) funktioniert es. Die Frage ist wie bekomme ich die Produktionsfirma mit in die SELECT Anweisung.:

Der User 1 darf Company 1, 2, 3 sehen, egal ob Sie Vertrieb oder Produktion sind.
Der User 2 darf Company 1, 2 sehen, egal ob Sie Vertrieb oder Produktion sind.
Der User 3 darf Company 3 sehen, egal ob Sie Vertrieb oder Produktion sind.

User 3 darf nur Projekt 3 und Projekt 4 sehen.
User 2 darf nur Projekt 1 und Projekt 2 sehen.
User 1 darf alle Projekte 1,2,3 und 3 sehen.

Die Company A (1), ist eine Vertriebsfirma.
Die Company B (2), ist eine Produktionsfirma.
Die Company C (3), ist eine Vertriebs- und Produktionsfirma.

Dem Projekt1 (1) ist die Vertriebsfirma Company A (1) und der Produktionsfirma Company B (2) zugeordnet.
Dem Projekt2 (2) ist die Vertriebsfirma Company A (1) und der Produktionsfirma Company C (3) zugeordnet.
Dem Projekt3 (3) ist die Vertriebsfirma Company C (3) und der Produktionsfirma Company C (3) zugeordnet.
Dem Projekt4 (4) ist die Vertriebsfirma Company C (3) und der Produktionsfirma Company B (2) zugeordnet.
__________________
fragen ist kostenlos!

Buschdieb.com
Buschdieb ist offline   Mit Zitat antworten
Alt 15.01.2012, 18:12  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Buschdieb Beitrag anzeigen
--
-- projekte --
--

CREATE TABLE `projekte` (
`id` int(20) unsigned NOT NULL default '0',
`name` varchar(25) NOT NULL,
`vg` int(1) NOT NULL COMMENT 'Vertriebsfirma',
`pg` int(1) NOT NULL COMMENT 'Produktionsfirma',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES
(1, 'Projekt1', 1, 2, 1),
(2, 'Projekt2', 1, 3, 1),
(3, 'Projekt3', 3, 3, 2),
(4, 'Projekt4', 3, 2, 3)
Das Insert paßt ned zur Definition, kid gibt es nicht. 'vg' und 'pg' sind ja sicherlich rein logisch gesehen BOOL- Spalten, die MySQL nicht kann. Was bedeuten in dieser Welt Werte von 1,2 und 3?

Und worauf bezieht sich uid in company_rechte?


Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 15.01.2012, 18:39  
Erfahrener Benutzer
 
Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse:
Anfänger
Buschdieb
Standard

Zitat:
Zitat von akretschmer Beitrag anzeigen
Das Insert paßt ned zur Definition, kid gibt es nicht. 'vg' und 'pg' sind ja sicherlich rein logisch gesehen BOOL- Spalten, die MySQL nicht kann. Was bedeuten in dieser Welt Werte von 1,2 und 3?

Und worauf bezieht sich uid in company_rechte?

Andreas
Ach Mist da hab ich wohl die falsche Datei benutzt. Hier die funktionierende Daten.

VG steht für Vertrieb. 1 = JA; 0 = NEIN
PG steht für Produktion. 1 = JA; 0 = NEIN

logisch gesehen sind es BOOL-Spalten. Richtig!


Code:
INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES
(1, 'Projekt1', 1, 2, 1),
Projekt ID, Projekt Name, Vertriebsfirma, Produktionsfirma, Kunden ID

id = Projekt ID
name = Projekt Name
vg = ID der Vertriebsfirma aus Tabelle Company
pg = ID der Produktionsfirma aus Tabelle Company
kid = ist die ID des Kunden

company_rechte

Code:
CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)

cid= Company ID aus Tabelle Company
uid = User ID aus Tabelle User

Es ist also die Zuordnungstabelle.

Code:
-- 
-- company --
-- 

CREATE TABLE `company` (
  `id` int(7) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `vg` int(1) NOT NULL,
  `pg` int(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `company` (`id`, `name`,`vg`, `pg`) VALUES 
(1, 'CompanyA',1, 0),
(2, 'CompanyB',0, 1),
(3, 'CompanyC',1, 1)

-- 
-- company_rechte --
-- 

CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)

INSERT INTO `company_rechte` (`cid`, `uid`) VALUES 
(1, 1,),
(2, 1,),
(3, 1,),
(1, 2,),
(2, 2,),
(3, 3,)

-- 
-- projekte --
-- 

CREATE TABLE `projekte` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  `vg` int(1) NOT NULL COMMENT 'Vertriebsfirma',
  `pg` int(1) NOT NULL COMMENT 'Produktionsfirma',
  `kid` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES 
(1, 'Projekt1', 1, 2, 1),
(2, 'Projekt2', 1, 3, 1),
(3, 'Projekt3', 3, 3, 2),
(4, 'Projekt4', 3, 2, 3)

-- 
-- kunden --
-- 

CREATE TABLE `kunden` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `kunden` (`id`, `name`) VALUES 
(1, 'Kunde1'),
(2, 'Kunde2'),
(3, 'Kunde3'),
(4, 'Kunde4')
__________________
fragen ist kostenlos!

Buschdieb.com
Buschdieb ist offline   Mit Zitat antworten
Alt 15.01.2012, 20:20  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Buschdieb Beitrag anzeigen
Ach Mist da hab ich wohl die falsche Datei benutzt. Hier die funktionierende Daten.

VG steht für Vertrieb. 1 = JA; 0 = NEIN
PG steht für Produktion. 1 = JA; 0 = NEIN

logisch gesehen sind es BOOL-Spalten. Richtig!


Code:
INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES
(1, 'Projekt1', 1, 2, 1),
Projekt ID, Projekt Name, Vertriebsfirma, Produktionsfirma, Kunden ID

id = Projekt ID
name = Projekt Name
vg = ID der Vertriebsfirma aus Tabelle Company
pg = ID der Produktionsfirma aus Tabelle Company
kid = ist die ID des Kunden

company_rechte

Code:
CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)

cid= Company ID aus Tabelle Company
uid = User ID aus Tabelle User

Es ist also die Zuordnungstabelle.

Code:
-- 
-- company --
-- 

CREATE TABLE `company` (
  `id` int(7) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `vg` int(1) NOT NULL,
  `pg` int(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `company` (`id`, `name`,`vg`, `pg`) VALUES 
(1, 'CompanyA',1, 0),
(2, 'CompanyB',0, 1),
(3, 'CompanyC',1, 1)

-- 
-- company_rechte --
-- 

CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)

INSERT INTO `company_rechte` (`cid`, `uid`) VALUES 
(1, 1,),
(2, 1,),
(3, 1,),
(1, 2,),
(2, 2,),
(3, 3,)

-- 
-- projekte --
-- 

CREATE TABLE `projekte` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  `vg` int(1) NOT NULL COMMENT 'Vertriebsfirma',
  `pg` int(1) NOT NULL COMMENT 'Produktionsfirma',
  `kid` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES 
(1, 'Projekt1', 1, 2, 1),
(2, 'Projekt2', 1, 3, 1),
(3, 'Projekt3', 3, 3, 2),
(4, 'Projekt4', 3, 2, 3)

-- 
-- kunden --
-- 

CREATE TABLE `kunden` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `kunden` (`id`, `name`) VALUES 
(1, 'Kunde1'),
(2, 'Kunde2'),
(3, 'Kunde3'),
(4, 'Kunde4')
Deine Daten scheinen annähernd zu Deinen Wunschresultaten zu stimmen, falls ich Dich korrekt verstanden habe. Ideal wäre natürlich, die Tabellen gleich mit korrekten FK-beziehungen anzulegen:

Code:
test=*#
test=*# \d company
                        Table "buschdieb.company"
 Column |  Type   |                      Modifiers
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('company_id_seq'::regclass)
 name   | text    |
 vg     | boolean |
 pg     | boolean |
Indexes:
    "company_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "company_rechte" CONSTRAINT "company_rechte_cid_fkey" FOREIGN KEY (cid) REFERENCES company(id)
    TABLE "projekte" CONSTRAINT "projekte_pg_fkey" FOREIGN KEY (pg) REFERENCES company(id)
    TABLE "projekte" CONSTRAINT "projekte_vg_fkey" FOREIGN KEY (vg) REFERENCES company(id)

test=*# \d company_rechte
Table "buschdieb.company_rechte"
 Column |  Type   | Modifiers
--------+---------+-----------
 cid    | integer |
 kid    | integer |
Foreign-key constraints:
    "company_rechte_cid_fkey" FOREIGN KEY (cid) REFERENCES company(id)
    "company_rechte_kid_fkey" FOREIGN KEY (kid) REFERENCES kunden(id)

test=*# \d projekte
  Table "buschdieb.projekte"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer | not null
 name   | text    |
 vg     | integer |
 pg     | integer |
 kid    | integer |
Indexes:
    "projekte_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "projekte_kid_fkey" FOREIGN KEY (kid) REFERENCES kunden(id)
    "projekte_pg_fkey" FOREIGN KEY (pg) REFERENCES company(id)
    "projekte_vg_fkey" FOREIGN KEY (vg) REFERENCES company(id)

test=*# \d kunden
   Table "buschdieb.kunden"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer | not null
 name   | text    |
Indexes:
    "kunden_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "company_rechte" CONSTRAINT "company_rechte_kid_fkey" FOREIGN KEY (kid) REFERENCES kunden(id)
    TABLE "projekte" CONSTRAINT "projekte_kid_fkey" FOREIGN KEY (kid) REFERENCES kunden(id)

test=*#
Mit Daten:

Code:
test=*# select * from company;
 id |   name   | vg | pg
----+----------+----+----
  1 | CompanyA | t  | f
  2 | CompanyB | f  | t
  3 | CompanyC | t  | t
(3 rows)

test=*# select * from company_rechte ;
 cid | kid
-----+-----
   1 |   1
   2 |   1
   3 |   1
   1 |   2
   2 |   2
   3 |   3
(6 rows)

test=*# select * from kunden ;
 id |  name
----+--------
  1 | Kunde1
  2 | Kunde2
  3 | Kunde3
  4 | Kunde4
(4 rows)

test=*# select * from projekte ;
 id |   name   | vg | pg | kid
----+----------+----+----+-----
  1 | Projekt1 |  1 |  2 |   1
  2 | Projekt2 |  1 |  3 |   1
  3 | projekt3 |  3 |  3 |   2
  4 | Projekt4 |  3 |  2 |   3
(4 rows)
Abfragen:

Code:
test=*# select p.id, p.name, c1.name as vg, c2.name as pg from projekte p left join company c1 on (p.vg=c1.id) left join company c2 on (p.pg=c2.id);
 id |   name   |    vg    |    pg
----+----------+----------+----------
  1 | Projekt1 | CompanyA | CompanyB
  2 | Projekt2 | CompanyA | CompanyC
  3 | projekt3 | CompanyC | CompanyC
  4 | Projekt4 | CompanyC | CompanyB
(4 rows)



test=*# select k.name, array_agg(p.name) from kunden k left join projekte p on k.id=p.kid group by k.name;
  name  |      array_agg
--------+---------------------
 Kunde1 | {Projekt1,Projekt2}
 Kunde2 | {projekt3}
 Kunde3 | {Projekt4}
 Kunde4 | {NULL}
(4 rows)

test=*# select k.id as userid, array_agg(c.name) from kunden k left join company_rechte cr on (k.id=cr.kid) left join company c on cr.cid=c.id group by k.id;
 userid |          array_agg
--------+------------------------------
      1 | {CompanyA,CompanyB,CompanyC}
      2 | {CompanyA,CompanyB}
      3 | {CompanyC}
      4 | {NULL}
(4 rows)

Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 15.01.2012, 22:34  
Erfahrener Benutzer
 
Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse:
Anfänger
Buschdieb
Standard

Hallo Andreas,

vielen Dank für deine Antwort.

Beim durchsehen ist mir aufgefallen, dass ich die User Tabelle gar nicht angegeben habe und Du mit der Kunden Tabelle gearbeitet hast. Das spielt aber im ersten Augenblick keine Rolle.

Irgendwie seh ich noch nicht den Zusammenhang wie ich alles Projekte eines User/Kunden in Verbindung mit dem company_rechtem ausgeben kann. Die drei Abfragen verstehe ich.

Kann ich diese Zusammenführen?

Ziel einer einzigen Abfrage soll sein:

1. Formulierung: Gebe alle Projekte eines User mit der ID 1 aus die dem User entweder über die Vertriebsfirma (vg) oder über die Produktionsfirma (pg) zugeordnet ist.

2. Formulierung: Gebe alle Projekte einer Vertriebs- und Produktionsfirma aus die dem User/Kunde mit der ID "1" in company_rechte zugeordnet ist.

Die Tabelle company_rechte bildet ja die Verknüpfung zwischen User/Kunden Tabelle und der Company Tabelle. In der Projekte Tabelle findet die Zuordnung zur Vertriebs- (vg) und Produktionsfirma (pg) statt.

Code:
-- 
-- user --
-- 

CREATE TABLE `user` (
  `id` int(7) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `user` (`id`, `name`) VALUES 
(1, 'User1'),
(2, 'User2'),
(3, 'User3')

-- 
-- company --
-- 

CREATE TABLE `company` (
  `id` int(7) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `vg` int(1) NOT NULL,
  `pg` int(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `company` (`id`, `name`,`vg`, `pg`) VALUES 
(1, 'CompanyA',1, 0),
(2, 'CompanyB',0, 1),
(3, 'CompanyC',1, 1)

-- 
-- company_rechte --
-- 

CREATE TABLE `company_rechte` (
  `cid` int(11) NOT NULL,
  `uid` int(11) NOT NULL
)


INSERT INTO `company_rechte` (`cid`, `uid`) VALUES 
(1, 1,),
(2, 1,),
(3, 1,),
(1, 2,),
(2, 2,),
(3, 3,)

-- 
-- projekte --
-- 

CREATE TABLE `projekte` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  `vg` int(1) NOT NULL COMMENT 'Vertriebsfirma',
  `pg` int(1) NOT NULL COMMENT 'Produktionsfirma',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `projekte` (`id`, `name`, `vg`, `pg`, `kid`) VALUES 
(1, 'Projekt1', 1, 2, 1),
(2, 'Projekt2', 1, 3, 1),
(3, 'Projekt3', 3, 3, 2),
(4, 'Projekt4', 3, 2, 3)

-- 
-- kunden --
-- 

CREATE TABLE `kunden` (
  `id` int(20) unsigned NOT NULL default '0',
  `name` varchar(25) NOT NULL,	
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `kunden` (`id`, `name`) VALUES 
(1, 'Kunde1'),
(2, 'Kunde2'),
(3, 'Kunde3'),
(4, 'Kunde4')
__________________
fragen ist kostenlos!

Buschdieb.com
Buschdieb 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
Problem mit Abfrage - join, inner join, distinct? Gachet01 Datenbanken 2 27.01.2011 06:49
SQL Abfrage Fehler nach Umstieg von MySQL4 auf MySQL 5 chefmaik PHP Tipps 2010 5 05.08.2010 16:02
INNER JOIN funkt noch nicht ganz wie er soll goodie Datenbanken 1 01.11.2009 12:30
[Erledigt] Benötige hilfe bei einem doppelten INNER JOIN boeserbube Datenbanken 5 11.08.2009 13:29
Sortieren (ORDER BY) nach INNER JOIN asyoulikeit Datenbanken 10 21.04.2009 15:01
Performance von INNER JOIN Abfrage erhöhen - Vorschläge? Timbob Datenbanken 8 05.03.2009 17:54
[Erledigt] Problem mit DISTINCT &amp;amp;amp; INNER JOIN fulltilt Datenbanken 1 12.02.2009 17:14
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
inner join aus db PHP Tipps 2006 8 22.01.2006 01:23
* und Inner Join? Paulo Datenbanken 2 27.09.2005 14:26
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
[Erledigt] INNER JOIN abfrage zusammen stricken Datenbanken 3 04.07.2005 02:21
MySql - Inner Join? PHP Tipps 2005-2 2 14.06.2005 15:24
inner join Datenbanken 12 23.09.2004 13:22
INNER JOIN - realisieren? Schaelle PHP Tipps 2004 1 04.07.2004 09:07

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql inner join, problem join group by schlüssel \doppelte datensätze\, mysql inner join auf 2 fk auf eine tabelle, doppelte datenbankabfrage

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:35 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