Egyszerű ( gondolom én ) MySQL kérdés

 ( dNi | 2014. augusztus 5., kedd - 17:55 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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 :)