Topic: Trigubos užklausos problema

Sveiki,
Niekaip neišeina viena užklausą, kad pateiktu man norimus rezultatus iš dviejų lentelių

pvz.
1lentele

-----------------
ID   |  T.PAV  |
-----------------
1     |   AAA   |
-----------------
2     |   BBB   |
-----------------
3     |   CCC  |
-----------------

2lentele

------------------------------------
ID   |   Is_T_PAV  |   I_T_PAV |
------------------------------------
1     |       1          |        2      |
------------------------------------
2     |       2          |        1      |
------------------------------------
3     |       1          |        3      |
------------------------------------

ir panašiai

noriu gauti tokį rezultatą (lentele):

--------------------------------
|   Is_T_PAV  |   I_T_PAV |
--------------------------------
|       AAA      |     BBB     |
--------------------------------
|       BBB      |     AAA     |
--------------------------------
|       AAA      |    CCC     |
--------------------------------

Užklausą formuoju taip

WITH marsrutas(Is_T_PAV, I_T_PAV) AS (
SELECT Is_T_PAV
FROM 2lentele, 1lentele
WHERE 1lente.id = 2lentele.Is_T_PAV
UNION
SELECT I_T_PAV
FROM 2lentele, 1lentele
WHERE 1lente.id = 2lentele.I_T_PAV
)
SELECT Is_T_PAV, I_T_PAV
FROM marsrutas
ORDER BY  Is_T_PAV

Bandžiau įvairiais būdais, niekaip nepavyksta, atskirai formuojant užklausas gaunu rezultatus

Gal kas galite patarti ..

Dėkui

Re: Trigubos užklausos problema

Aš suprantu, kad logika turi būti tokia: antrą lentelę sujungi (JOIN) su pirma du kartus, pirmą kartą pagal stulpelį Is_T_PAV antrą kartą pagal stulpelį I_T_PAV, maždaug taip:

SELECT lentele1_1.T.PAV AS Is_T_PAV,
   lentele1_1.T.PAV AS I_T_PAV
FROM lentele2
   LEFT JOIN lentele1 AS lentele1_1 ON lentele2.Is_T_PAV = lentele1_1.ID
   LEFT JOIN lentele1 AS lentele1_2 ON lentele2.I_T_PAV = lentele1_2.ID

čia naudoju LEFT JOIN'ą, nes nežinau ar pilnai lentelėse atitinka duomenys, t.y. ar galima saugiai naudoti INNER JOIN'ą.

3 (edited by Ramex 2009-05-14 15:42:10)

Re: Trigubos užklausos problema

viskas čia labai simple, tik tu kažkaip keistai rašai užklausas, matomai nuo kitos sistemos nušokęs. reikėtų maždaug taip:

SELECT t11.T.PAV AS Is_T_PAV, t12.T.PAV AS I_T_PAV
FROM 2lentele AS t2
LEFT JOIN 1lentele AS t11 ON t11.id=t2.Is_T_PAV
LEFT JOIN 1lentele AS t12 ON t12.id=t2.I_T_PAV

turėtum gauti tai ko nori. plius patariu nenaudoti taškų stulpelių pavadinimuose, nes jie naudojami užklausose kaip stulpelių hierarchijos skiriklis, tad gali būt problemų dėl užklausos vykdymo (garantuot negaliu, neteko to naudot).

Su sąlyga, kad šūdo nebus...

Re: Trigubos užklausos problema

Didelis dėkui už patarimus ir veikiančia užklausos forma.

Re: Trigubos užklausos problema

Ramex wrote:

turėtum gauti tai ko nori. plius patariu nenaudoti taškų stulpelių pavadinimuose, nes jie naudojami užklausose kaip stulpelių hierarchijos skiriklis, tad gali būt problemų dėl užklausos vykdymo (garantuot negaliu, neteko to naudot).

Galima naudoti taip:

t12.`T.PAV`

Re: Trigubos užklausos problema

Sveiki,

dar truputi informacijos norėčiau, ar mysql kalboje įmanoma taip padaryt kad prieš tai buvusioje lentelėje
------------------------------------
ID   |   Is_T_PAV  |   I_T_PAV |
------------------------------------
1     |       1          |        2      |
------------------------------------
2     |       2          |        1      |
------------------------------------
3     |       1          |        3      |
------------------------------------

išmestu pasikartojanti įrašą

------------------------------------
ID   |   Is_T_PAV  |   I_T_PAV |
------------------------------------
1     |       1          |        2      |
------------------------------------
2     |       2          |        1      |
------------------------------------

atvaizduojant tik vieną iš jų

tarkim
------------------------------------
ID   |   Is_T_PAV  |   I_T_PAV |
------------------------------------
1     |       1          |        2      |
------------------------------------

Ačiū,

Re: Trigubos užklausos problema

O kurie čia pasikartojantys įrašai? Mano akimis žiūrint - visi skirtingi (-;

Re: Trigubos užklausos problema

pasikartojantys yra šie

ID   |   Is_T_PAV  |   I_T_PAV |
------------------------------------
1     |       1          |        2      |
------------------------------------
2     |       2          |        1      |
------------------------------------

tik gal šiame pvz nelabai matosi,
bet esmė, kad man reikalinga tik vienas iš jų, nes pvz jei būtų atskiras stulpelis  maršruto ilgis,
tai abejose rodytų tą patį, aišku tą problemą galima išspręsti su php, bet man įdomu ar mysql tai įmanoma

Re: Trigubos užklausos problema

Kad įmanoma tai faktas, bet kad bus teisingai naudojami resursai tai abejočiau, nes MySQL yra duomenų saugojimas ir išgavimas. čia žaidžia tik ta dalis "buznio logikos", kuri susijusi su duomenimis, o tai ką tu sakai netgi prieštarauja duomenų unikalumui, vienodumui ir pan. Nes žiūrint iš MySQL pozicijos tie įrašai yra skirtingi. Todėl su standartinėm užklausų komandom tu jų neidentifikuosi. O nestandartinės bus lėtos, sunkiai užrašomos ir pan.

10

Re: Trigubos užklausos problema

Aišku, tai tuomet pasidarysiu su PHP.
Dėkui