Twój pomysł ciekawy ale troszkę inaczej to chciałem zrobić.
Pomyślałem żeby to nieco zmodyfikować i pokazać
CREATE TABLE IF NOT EXISTS `umowy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` varchar(4) COLLATE utf8_polish_ci DEFAULT NULL,
`rodzaj_umowy` varchar(5) COLLATE utf8_polish_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=14 ;
INSERT INTO `umowy` (`id`, `status`, `rodzaj_umowy`) VALUES
(3, 'f', '1'),
(4, 'f', '1'),
(5, 'f', '1'),
(6, 'f', '1'),
(7, 'g', '2'),
(8, 'y', '2'),
(9, 'h', '2'),
(10, 'g', '2'),
(11, 'g', '2'),
(12, 'e', '3'),
(13, 't', '3');
Tabele z rodzajami umów (one z tabelą "umowy" są w relacji jeden do jeden):
CREATE TABLE IF NOT EXISTS `umowy_1` (
`umowy_id` int(11) NOT NULL,
`cos_innego3` varchar(45) COLLATE utf8_polish_ci DEFAULT NULL,
PRIMARY KEY (`umowy_id`),
KEY `fk_umowy_1_umowy1` (`umowy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
INSERT INTO `umowy_1` (`umowy_id`, `cos_innego3`) VALUES
(3, '1dfdgf'),
(4, '1adsfdg'),
(5, '1esrfd'),
(6, '1asrg');
CREATE TABLE IF NOT EXISTS `umowy_2` (
`umowy_id` int(11) NOT NULL,
`nip` varchar(4) COLLATE utf8_polish_ci DEFAULT NULL,
PRIMARY KEY (`umowy_id`),
KEY `fk_umowy_2_umowy1` (`umowy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
INSERT INTO `umowy_2` (`umowy_id`, `nip`) VALUES
(7, '3414'),
(8, '3141'),
(9, '3234'),
(10, '4135');
CREATE TABLE IF NOT EXISTS `umowy_3` (
`umowy_id` int(11) NOT NULL,
`cos_innego` varchar(4) COLLATE utf8_polish_ci DEFAULT NULL,
PRIMARY KEY (`umowy_id`),
KEY `fk_umowy_3_umowy1` (`umowy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
INSERT INTO `umowy_3` (`umowy_id`, `cos_innego`) VALUES
(12, 'fs'),
(13, 'fs');
tabela:
tab: osoby_sprawdzajace pozostanie bez zmian
Jak loguje się osoba_sprawdzająca to wykonuje się zapytanie
SELECT rodzaje_umow FROM osoby_sprawdzające WHERE login=$login_zalogowanej_osoby;
W ten sposób otrzymamy przypisane do niego rodzaje umów. w postacie ciągu np. "1, 2, 3" - ciąg oznacza że ta osoba ma dostęp do umów 1 (pierwszego) rodzaju, 2 (drugiego), 3 (trzeciego).
Potem chciałbym jednym zapytaniem pobrać jego wszystkie umowy razem z ich indywidualnymi szczegółami.
Zatem niezbędne będzie zapytanie łączące tabele główną "umowy" z tabelami rodzajów.
Załóżmy że poprzednie zapytanie wyświetliło: "1, 2", Zatem będziemy łączyć tabele: "umowy" , "umowy_1", "umowy_2".
SELECT u.*, u1.cos_innego3, u2.nip FROM umowy u
LEFT JOIN umowy_1 u1 ON u.id=u1.umowy_id
LEFT JOIN umowy_2 u2 ON u.id=u2.umowy_id
WHERE u.rodzaj_umowy IN(1, 2) ORDER BY u.id LIMIT 30
wynik:
Kod
id status rodzaj_umowy cos_innego3 nip
3 f 1 1dfdgf NULL
4 f 1 1adsfdg NULL
5 f 1 1esrfd NULL
6 f 1 1asrg NULL
7 g 2 NULL 3414
8 y 2 NULL 3141
9 h 2 NULL 3234
10 g 2 NULL 4135
11 g 2 NULL NULL
Zapytanie działa poprawnie. Ale niewiem jak to jest wydajne. No i widac pewne wady.
Co prawda to system pisany w php będzie dbał by coś takiego nie miało miejsca, ale widzimy że jak wprowadzona jest nowa umowa to trzeba ją wprowadzać w dwóch miejscach. Najpierw w tabeli "umowy" potem w "umowy_1" lub innej zależnie od pola u.rodzaj_umowy.
Dlatego tak myslę czy nie da się tego jakos ciekawiej zrobić