Jump to content
php.lv forumi

help ar queriju


john.brown

Recommended Posts

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 by john.brown
Link to comment
Share on other sites

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

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 by john.brown
Link to comment
Share on other sites

×
×
  • Create New...