Autor Zpráva
andy_99
Profil
ahoj potrebujem len malú radu.
neviem si dat rady zo selectom , ktorý by mal vybrať všetkých mojich priateľov samozrejme okrem mňa...
štruktúratabulky je (id_priatelstva, odosielatel_ziadosti_id, prijimatel_ziadosti_id, status ) .. ošetrenéto mam tak že priateľstvá budú len na jednom riadku a nebudú sa tvoriť duplicitne..

status (1- nepotvrdena ziadost, 2-potvrdena ziadost)

viete mi prosím niekto poradiť ako vybrať z tejto tabuľky len id-cka ktore su so mnou priatelia?
Dúfam že sa v tom bude dať vyznať čo vlastne chcem..
Ďakujem
juriad
Profil
select odesilatel_zadosti_id as pritel
from pratelstvi
where prijimatel_zadosti_id = $moje_id and status = 2

union

select prijimatel_zadosti_id as pritel
from pratelstvi
where odesilatel_zadosti_id = $moje_id and status = 2
DJ Miky
Profil
Kromě juriadova řešení s UNION by to šlo napsat i jedním dotazem, ale spíše bych kvůli zjednodušení dotazů popřemýšlel o přidání druhé vazební tabulky s lidmi, kterých se přátelství týká (moje_id, priatel_id, id_priatelstva), přičemž řádky v této tabulce by byly duplikovány s prohozenými moje_id a priatel_id. Pak by se výrazně zjednodušilo dotazování na přátele určitého člověka (nebylo by potřeba kontrolovat, zda je příjemce nebo odesílatel žádosti) – za cenu duplikace dat a tím i mírně složitějšího udržení konzistence.
juriad
Profil
Nebo by to šlo jedním dotazem s logickým nebo v podmínce a ifem v selektu. Takový dotaz by však by pomalejší než spojení těchto dvou triviálních, neboť by u něj nešlo využít indexy.
llook
Profil
To s tím IFem by mělo být schopné použít indexy, protože výsledek té funkce není pro samotný výběr řádků potřeba:

SELECT IF(`odosielatel_ziadosti_id` = :moje_id, `prijimatel_ziadosti_id`, `odosielatel_ziadosti_id`) AS `priatel_id`
FROM `priatelstva`
WHERE (`prijimatel_ziadosti_id` = :moje_id OR `odosielatel_ziadosti_id` = :moje_id) AND `status` = 2;
juriad
Profil
llook:
U chytřejších databází možná; mysql s operátorem OR ve WHERE může mít problémy. Union je často doporučované řešení.
Nevím jak je na to mysql v současnosti; nemám čas to změřit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: