john.brown Posted November 18, 2006 Report Share Posted November 18, 2006 (edited) Ir tabulas: folders: fid | path folders_ugroups: fid | gid user_folder: fid | user_id Un šitāds querijs: SELECT DISTINCT f.fid, f.path FROM folders AS f, user_folder AS uf, folders_ugroups AS fu WHERE ( f.fid = uf.fid AND uf.user_id =1 ) OR ( f.fid = fu.fid AND fu.gid IN ( 1, 2 ) ) ORDER BY f.path Trabls ir tāds, ka, ja iekš user_folder nav ierakstu, tad šamais neko neatgriež. Kaut, pēc domas, vajadzēja atgriezt to, kas sanāk no tabulas folders_ugroups. Var kāds ko līdzet? P.S. ja iekš user_folder ir kaut 1 ieraksts, atgriež visu, kā bija domāts - gan pec user_folder, gan folders_ugroups. Edited November 18, 2006 by john.brown Link to comment Share on other sites More sharing options...
bubu Posted November 18, 2006 Report Share Posted November 18, 2006 Selektu vajag iedomāties tā, ka viņš uztaisa tabulu ierakstu dekarata reizinājumu (lielu lielu tabulu ar visām iespējamajām ierakstu kombinācijām), un tad katrai tās lielās tabulas rindiņai pielieto WHERE nosacījumu. Loģiski, ja user_folders tabulā nebūs ierakstu, tad arī lielā tabula būs tukša. Tev vajag LEFT JOIN izmantot, nevis parastu JOIN (aka , starp tabulām FROM daļā). Link to comment Share on other sites More sharing options...
john.brown Posted November 18, 2006 Author Report Share Posted November 18, 2006 Nu, jā, paldies. LEFT JOIN palīdzēja :) Link to comment Share on other sites More sharing options...
john.brown Posted November 19, 2006 Author Report Share Posted November 19, 2006 (edited) Jā, pasteidzos priecāties :( Šitāds querijs pareizi aizgāja man uz lokālās mašīnas (Mysql 5) : SELECT DISTINCT f.fid, f.path FROM folders AS f LEFT JOIN user_folder AS uf USING ( fid ) LEFT JOIN folders_ugroups AS fu USING ( fid ) WHERE ( f.fid = uf.fid AND uf.user_id =1 AND uf.can_read = '1' ) OR ( f.fid = fu.fid AND fu.gid IN ( 1, 2 ) AND fu.can_read = '1' ) ORDER BY f.path Dimžēl, uz production mašīnas (Mysql 4.1.21) šamais neiet. Tā pati vaina - ja tukša user_folder, neatgriež neko, tak ja user_folder ir k.kas, tad atgriež tik to ierakstu no folders, kuram ir atbilstošs ieraksts iekš user_folder. T.b. noteikums priekš atbilstības ar folders_ugroups tiek ignorēts :( Neesmu specīgs iekš sql, varetu to dabūt ar diviem pieprasījumiem, tak ļoti negribas... Help...! #------------------- Sucks! Uz Mysql 4.1 iet šitāds, par kuru Mysql 5 lamājas: SELECT DISTINCT f.fid, f.path FROM folders AS f LEFT JOIN user_folder AS uf, folders_ugroups AS fu USING ( fid ) WHERE ( f.fid = uf.fid AND uf.user_id =1 AND uf.can_read = '1' ) OR ( f.fid = fu.fid AND fu.gid IN ( 1, 2 ) AND fu.can_read = '1' ) ORDER BY f.path Vot p*&$%#@c! :( Edited November 19, 2006 by john.brown Link to comment Share on other sites More sharing options...
Recommended Posts