Sziasztok!
Gyakorolgatok egy-két dolgot, de az sql még nem igazán az erősségem. Az alábbi problémában kérném a segítségeteket:
Van két táblám, leegyszerűsítve kb így:
1. tábla:
| id | x_hash | y_hash |
------------------------
| 1 | aaa | bbb |
| 2 | bbb | ccc |
| 3 | aaa | ccc |
2. tábla
| id | hash | string |
----------------------
| 1 | aaa | str1 |
| 2 | bbb | str2 |
| 3 | ccc | str3 |
Arra lenne szükségem, hogy ha select-tel az első táblában lekérem az aaa-t akkor bbb-t adjon vissza, ha pedig a bbb-t akkor ccc-t. Tehát mindig a két oszlop közül azt, amelyikben épp nem a lekért string van. Ezeket a visszatérő értékeket pedig a második táblával joinolva össze kellene kapcsolni a hash-el és visszakapni aaa esetén az str1-et, bbb esetén az str2-t, stb.
Hogyan lehetséges ez?:)
Köszönöm a segítséget.
Hozzászólások
Erre gondolsz?
SELECT masodik.string
FROM elso LEFT JOIN masodik
ON (elso.y_hash=masodik.hash)
Lehet én vagyok a béna, de nekem ez nem azt adta vissza amire szükségem lenne.
Ez egy barát jelölős dolog akarna lenne, X bejelöli Y-t. A hash alapján ( ami egy egyedi azonosító ) a tábla egyből ki szeretném szedni az illető barátjainak az azonosítóját, ami alapján a tábla kettőből visszakaphatnám a barátok nevét. ( string )
Ugy erted: "Arra lenne szükségem, hogy ha select-tel az első táblában lekérem az aaa-t akkor bbb-t es ccc-t adjon vissza, ha pedig a bbb-t akkor ccc-t"?
Ha ccc-t akkor pedig aaa-t es bbb-t?
Igen csak elsőnek félreértettem a kérdésedet.
A db alapján aaa barátja bbb-nek és ccc-nek is, így a bbb és ccc azonosítót kinyerve és joinolva a tábla kettőhöz, str2 és str3-at kellene visszakapnom, mint barátok nevei.
ah oke
select
t2.string
from
tabla1 t1
join tabla2 t2 on ((t1.hash_x = :id and t1.hash_y = t2.hash)
or (t1.hash_y = :id and t1.hash_x = t2.hash)
Itt van egy parameterized query. Nem teszteltem, de szerintem mukodnie kell.
Vagy csak ugy mindenkinek, mindenki kapcsolata kene?
vagy csinalhatsz union-t is. Ugy talan jobban atlathato:
select t2.string
from tabla1 t1
join tabla t2 on t1.hash_y = t2.hash
where t1.hash_x = :id
union
select t2.string
from tabla1 t1
join tabla t2 on t1.hash_x = t2.hash
where t1.hash_y = :id
Mind a kettő tökéletesen működik, igazán köszönöm!
dNi-nek: talán le kéne tárolni valahol ,hogy ki-kivel van kapcsolatban, mert az így ha jól értem kb a lehetetlen, mert nincs egyértelmű kapcsolat a két tábla között számomra.
Két query-ből könnyedén lekérhető, korábban úgy csináltam, úgy gondoltam, van erre valami egyszerűbb megoldás is, de mivel nem igazán értek a db-khez, így a felépítése sem a legideálisabb ezek szerint :)
Sztem. ez a megoldás, feltételezve,hogy minden hash egyedi. Kipróbáltam és működik nálam.
1. tábla = relations
2. tábla = users
SELECT users.string FROM `relations` INNER JOIN users ON relations.y_hash=users.hash WHERE relations.x_hash='aaa'
Eredmény:
str2
str3
Ha csak egy bizonyos rekord érdekel,akkor alakítsd a feltételt :)