| | | | |
| |||||||
| Datenbanken SQL und Co |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | ||
| Gast
Beiträge: n/a
| Zitat:
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. | |
|
| | |||
| Erfahrener Benutzer Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse: Anfänger ![]() | Zitat:
Zitat:
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. | ||
| | |
| | |
| Erfahrener Benutzer Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse: Anfänger ![]() | Hallo Leute, wie angekündigt hier nun meine Beispieldaten. 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') |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse: Anfänger ![]() | 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') 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. |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse: Anfänger ![]() | Zitat:
Und worauf bezieht sich uid in company_rechte? Andreas | |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse: Anfänger ![]() | Zitat:
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), 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') | |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse: Anfänger ![]() | Zitat:
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=*#
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) 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 | |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 11.12.2004
Beiträge: 238
PHP-Kenntnisse: Anfänger ![]() | 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') |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ä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; 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 |