X-Git-Url: http://mop.ddnsfree.com/gitweb/?p=brisk.git;a=blobdiff_plain;f=sql%2Fsql.d%2F075-users-network.sql;h=c725938ce6a58c1745286f909d53dfb53b1ea038;hp=a4a99583bdfe1bc7a2cd41866b9c66728d0ca5e8;hb=c50bd1cf600bc07608e6dfdf4f7c854ee13aee29;hpb=e290c557994ea3531ef87bf2f40ad119af6aa970 diff --git a/sql/sql.d/075-users-network.sql b/sql/sql.d/075-users-network.sql index a4a9958..c725938 100644 --- a/sql/sql.d/075-users-network.sql +++ b/sql/sql.d/075-users-network.sql @@ -47,19 +47,34 @@ CREATE VIEW #PFX#usersnet_wideskill DROP VIEW #PFX#usersnet_narrowskill; CREATE VIEW #PFX#usersnet_narrowskill - AS SELECT un.owner AS owner, ur.target AS target, SUM(ur.skill * un.trust) / SUM(un.trust) AS skill, - COUNT(*) AS count, - SUM(CASE WHEN ur.friend = 1 THEN 1 ELSE 0 END) AS black -- count number of friend - -- blacklisting the target - FROM #PFX#usersnet AS un, #PFX#usersnet as ur - WHERE un.target = ur.owner AND un.friend = 5 -- ur owner must be bbf of un.owner - GROUP BY un.owner, ur.target HAVING SUM(CASE WHEN ur.friend = 1 THEN 1 ELSE 0 END) = 0; + AS SELECT + un.owner AS owner + , ur.target AS target + , SUM(ur.skill * un.trust) / SUM(un.trust) AS skill + , COUNT(*) AS count + FROM #PFX#usersnet AS un, #PFX#usersnet as ur + WHERE un.target = ur.owner AND un.friend = 5 -- 'ur' owner must be bbf of un.owner + AND ur.friend > 2 + GROUP BY un.owner, ur.target; + +DROP VIEW #PFX#usersnet_narrowblack; +CREATE VIEW #PFX#usersnet_narrowblack + AS SELECT DISTINCT un.owner AS owner, ur.target AS target, 1 AS black_cnt + FROM #PFX#usersnet AS un, #PFX#usersnet as ur + WHERE un.target = ur.owner + AND un.friend = 5 -- ur owner must be bbf of un.owner + AND ur.friend = 1; -- ur must be blacked DROP VIEW #PFX#usersnet_party; CREATE VIEW #PFX#usersnet_party - AS (SELECT ns.* FROM #PFX#usersnet_narrowskill AS ns - -- all except targets managed directly by the owner - WHERE target NOT IN (SELECT target FROM #PFX#usersnet WHERE owner = ns.owner) - UNION ALL - (SELECT owner, target, skill, 1 AS count, 0 AS black FROM #PFX#usersnet - WHERE friend > 2)) ORDER BY target; + AS (SELECT ns.*, nb.black_cnt FROM #PFX#usersnet_narrowskill AS ns + LEFT JOIN #PFX#usersnet_narrowblack AS nb + USING (owner, target) + -- all except targets managed directly by the owner + WHERE black_cnt is null + AND target NOT IN (SELECT target FROM #PFX#usersnet AS du WHERE du.owner = ns.owner) + UNION ALL + (SELECT owner, target, skill, 1 AS count, null AS black_cnt + FROM #PFX#usersnet + WHERE friend > 2)) + ORDER BY target;