Aleksandras wrote:Rašant čia apie tai, biški pagooglinau su naujom idėjom, apie tas visokias algebras. Tai radau keletą straipsnių apie tas algebras ir duomenų bazes. Pasirodo tie visi veiksmai "susikirtymas", "sandauga" ir pan, tarsi ir verčiasi kaip "inner/outer/left/right/etc JOIN".:) Jeigu įdomu, tai straipsneliai yra čia:
* http://ru.wikipedia.org/wiki/Р … amp;#1072; (rus) (grynai matematiškai apie rel. algebrą);
* http://en.wikipedia.org/wiki/Relational_algebra (eng) (panašiai, tik su realiais pavyzdžiai su DB lentelėm - kas darosi su lentelių įrašais, jas įvairiai apjungiant; čia jau radau daugmaž tą, ko man ir reikėjo;]);
* http://en.wikipedia.org/wiki/Relational_model (eng) (kaip viskas tai pavirto į reliacinės duomenų bazės).
* http://www.mstu.edu.ru/education/materi … h_4_4.html (rus) (čia galima rasti panašių paveiksliukų, kokius pateikiau ir aš, bet šalia yra pavaizduota ir kas gaunasi su įrašais, atliekant tam tirkas operacijas)
Taip, bet reikia nepamiršti, kad yra tokie dalykai kaip UNION ir pan. Tam tikros realicinės algebros operacijos atliekamos kitais funkcionalumais, o JOIN'ai padengia tik dalį tos visos metamatikos. Aišku, beveik neabejoju, kad daugumos duomenų bazių serverių vidinė realizacija remiasi matematiniais metodais/modeliais.
Atvaizduoti JOIN'us man labiausiai tiktų šie paveiksliukai ;)
ir
Aleksandras wrote:šiaip ar taip lauksiu iš Tavęs pavyzdžiu ir paaiškinimų.;) Pavyzdžių tai radau išties nemažai visokių, kurie lyg ir padėjo susivokti, tačiau vat su vienu iš pirmų pavyzdžiu, kurį prireikė padaryti, jau kilo klausimų. Tai pagrinde ir kreipiausi dėl to, kad padėtumėte suvokti JOIN'us su sau aktualiais pavyzdžiais.:)
Nežinau ar pora pavyzdžių padės daug suprasti. Realiai reikia skaityti metodiškai parašytas knygas apie duomenų bazes, nes darbui su duomenų bazėmis reikalingos žinios apie struktūras, ryšius, duomenų normalizacijas ir pan.
Tavo užduotį truputį praplėčiau, tikėdamasis, kad ji tiks ir platesniam žmonių ratui.
Taigi tarkime, kad turime 3 lenteles: Lankytojai, Tekstai ir Lankytojai_Tekstai
Kadangi:
a) ryšiai gali būti kelių tipų (pvz.: vienas su vienu, vienas su daug, daug su daug);
b) ryšiai dažniausiai realizuojami per stulpelius, kurie būna Raktai ar bent jau Indeksai;
c) MySQL'as neteikia ryšių tipizavimo galimybių;
Todėl Lankytojų ir Tekstų sujungimui naudojama papildoma lentelė (Lankytojai_Tekstai), kuri apibūdins koks Lankytojas kokį Tekstą skaitė. Labai neisigilinant tik paminėsiu, kad vienas Lankytojas gali būti skaitęs daug Tekstų po daugiau nei vieną katą.
Taigi pavyzdžiai:
1) Pateikti visų Lankytojų, kurie skaitė bent po vieną Tekstą sąrašą, kartu pateikiant ir skaitytą Tekstą
Užklausa:
SELECT Lankytojas, Tekstas
FROM Lankytojai
INNER JOIN Lankytojai_Tekstai ON Lankytojai.Lankytojo_ID = Lankytojai_Tekstai.Lankytojo_ID
INNER JOIN Tekstai ON Lankytojai_Tekstai.Teksto_ID = Tekstai.Teksto_ID
arba
SELECT Lankytojas, Tekstas
FROM Lankytojai
INNER JOIN Lankytojai_Tekstai USING (Lankytojo_ID)
INNER JOIN Tekstai USING (Teksto_ID)
Rezultatas:
+--------------+-----------+
| Lankytojas | Tekstas |
+--------------+-----------+
| Lankytojas 1 | Tekstas 2 |
| Lankytojas 2 | Tekstas 3 |
| Lankytojas 3 | Tekstas 1 |
| Lankytojas 3 | Tekstas 6 |
+--------------+-----------+
2) Pateikti visus Lankytojus, kurie neskaitė jokio Teksto
Užklausa:
SELECT Lankytojas
FROM Lankytojai
LEFT JOIN Lankytojai_Tekstai USING (Lankytojo_ID)
GROUP BY Lankytojai.Lankytojo_ID
HAVING COUNT(Lankytojai_Tekstai.Lankytojo_ID) = 0
Rezultatas: įrašu nėra, nes pagal pateiktus duomenis visi lankytojai kažką skaitė;
3) Pateikti Tekstus, kurių neskaitė joks Lankytojas
Užklausa:
SELECT Tekstas
FROM Tekstai
LEFT JOIN Lankytojai_Tekstai USING (Teksto_ID)
GROUP BY Tekstai.Teksto_ID
HAVING COUNT(Lankytojai_Tekstai.Teksto_ID) = 0
Rezultatas:
+-----------+
| Tekstas |
+-----------+
| Tekstas 4 |
| Tekstas 5 |
+-----------+
4) Pateikti visų Lankytojų ir visų Tekstų galimų kombinacijų sąrašą
Užklausa:
SELECT Lankytojas, Tekstas
FROM Lankytojai
JOIN Tekstai
Rezultatas:
+--------------+-----------+
| Lankytojas | Tekstas |
+--------------+-----------+
| Lankytojas 1 | Tekstas 1 |
| Lankytojas 2 | Tekstas 1 |
| Lankytojas 3 | Tekstas 1 |
| Lankytojas 1 | Tekstas 2 |
| Lankytojas 2 | Tekstas 2 |
| Lankytojas 3 | Tekstas 2 |
| Lankytojas 1 | Tekstas 3 |
| Lankytojas 2 | Tekstas 3 |
| Lankytojas 3 | Tekstas 3 |
| Lankytojas 1 | Tekstas 4 |
| Lankytojas 2 | Tekstas 4 |
| Lankytojas 3 | Tekstas 4 |
| Lankytojas 1 | Tekstas 5 |
| Lankytojas 2 | Tekstas 5 |
| Lankytojas 3 | Tekstas 5 |
| Lankytojas 1 | Tekstas 6 |
| Lankytojas 2 | Tekstas 6 |
| Lankytojas 3 | Tekstas 6 |
+--------------+-----------+
Gale pateikiu užklausas duomenų struktūroms sukurti:
CREATE TABLE `Lankytojai` (
`Lankytojo_ID` int(10) unsigned NOT NULL auto_increment,
`Lankytojas` varchar(255) NOT NULL,
PRIMARY KEY (`Lankytojo_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `Tekstai` (
`Teksto_ID` int(10) unsigned NOT NULL auto_increment,
`Tekstas` varchar(255) NOT NULL,
PRIMARY KEY (`Teksto_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Lankytojai_Tekstai | CREATE TABLE `Lankytojai_Tekstai` (
`Lankytojo_ID` int(10) unsigned NOT NULL,
`Teksto_ID` int(10) unsigned NOT NULL,
KEY `Lankytojo_ID` (`Lankytojo_ID`,`Teksto_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Galite prašyt norimų pavyzdžių pateiktiems duomenų struktūrai ir duomenims