Autor | Zpráva | ||
---|---|---|---|
andy_99 Profil |
#1 · Zasláno: 13. 11. 2013, 16:48:06
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 |
#2 · Zasláno: 13. 11. 2013, 16:59:35
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 |
#3 · Zasláno: 13. 11. 2013, 17:11:14
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 |
#4 · Zasláno: 13. 11. 2013, 17:14:47
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 |
#5 · Zasláno: 13. 11. 2013, 20:42:08
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 |
#6 · Zasláno: 13. 11. 2013, 22:27:39
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. |
||
Časová prodleva: 10 let
|
0