Changes between Version 10 and Version 11 of Complex DB Reports


Ignore:
Timestamp:
02/21/26 00:40:57 (8 days ago)
Author:
231035
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Complex DB Reports

    v10 v11  
    239239{{{
    240240WITH
    241 my_likes AS (
    242   SELECT fl.listing_id
    243   FROM favorite_listings fl
    244   WHERE fl.client_id = :user_id
    245 ),
    246 
    247 my_recent_likes AS (
    248   SELECT fl.listing_id
    249   FROM favorite_listings fl
    250   JOIN listings l ON l.listing_id = fl.listing_id
    251   WHERE fl.client_id = :user_id
    252   ORDER BY l.created_at DESC
    253   LIMIT :10
    254 ),
    255 
    256 similar_users AS (
    257   SELECT
    258     fl2.client_id AS other_user_id,
    259     COUNT(*)      AS overlap_likes
    260   FROM favorite_listings fl2
    261   JOIN my_likes ml ON ml.listing_id = fl2.listing_id
    262   WHERE fl2.client_id <> :user_id
    263   GROUP BY fl2.client_id
    264   HAVING COUNT(*) > 0
    265 ),
    266 
    267 cf_candidates AS (
    268   SELECT
    269     fl.listing_id,
    270     SUM(su.overlap_likes) AS cf_score,
    271     COUNT(DISTINCT su.other_user_id) AS liked_by_similar_users
    272   FROM similar_users su
    273   JOIN favorite_listings fl
    274     ON fl.client_id = su.other_user_id
    275   LEFT JOIN my_likes ml
    276     ON ml.listing_id = fl.listing_id
    277   WHERE ml.listing_id IS NULL 
    278   GROUP BY fl.listing_id
    279 ),
    280 
    281 content_candidates AS (
    282   SELECT
    283     l2.listing_id,
    284     COUNT(*) AS content_score
    285   FROM my_recent_likes r
    286   JOIN listings l1 ON l1.listing_id = r.listing_id
    287   JOIN listings l2 ON
    288       l2.listing_id <> l1.listing_id
    289       AND (
    290            (l2.species = l1.species)
    291         OR (l2.breed   = l1.breed)
    292         OR (l2.location = l1.location)
    293       )
    294   LEFT JOIN my_likes ml ON ml.listing_id = l2.listing_id
    295   WHERE ml.listing_id IS NULL
    296   GROUP BY l2.listing_id
    297 ),
    298 
    299 
    300 merged AS (
    301   SELECT
    302     COALESCE(cf.listing_id, cc.listing_id) AS listing_id,
    303     COALESCE(cf.cf_score, 0)              AS cf_score,
    304     COALESCE(cf.liked_by_similar_users, 0) AS liked_by_similar_users,
    305     COALESCE(cc.content_score, 0)         AS content_score
    306   FROM cf_candidates cf
    307   FULL OUTER JOIN content_candidates cc
    308     ON cc.listing_id = cf.listing_id
    309 )
     241    my_likes AS (
     242        SELECT fl.listing_id
     243        FROM favorite_listings fl
     244        WHERE fl.client_id = :user_id
     245    ),
     246
     247    my_recent_likes AS (
     248        SELECT fl.listing_id
     249        FROM favorite_listings fl
     250                 JOIN listings l ON l.listing_id = fl.listing_id
     251        WHERE fl.client_id = :user_id
     252        ORDER BY l.created_at DESC
     253        LIMIT 10
     254    ),
     255
     256    similar_users AS (
     257        SELECT
     258            fl2.client_id AS other_user_id,
     259            COUNT(*)      AS overlap_likes
     260        FROM favorite_listings fl2
     261                 JOIN my_likes ml ON ml.listing_id = fl2.listing_id
     262        WHERE fl2.client_id <> :user_id
     263        GROUP BY fl2.client_id
     264        HAVING COUNT(*) > 0
     265    ),
     266
     267    cf_candidates AS (
     268        SELECT
     269            fl.listing_id,
     270            SUM(su.overlap_likes) AS cf_score,
     271            COUNT(DISTINCT su.other_user_id) AS liked_by_similar_users
     272        FROM similar_users su
     273                 JOIN favorite_listings fl
     274                      ON fl.client_id = su.other_user_id
     275                 LEFT JOIN my_likes ml
     276                           ON ml.listing_id = fl.listing_id
     277        WHERE ml.listing_id IS NULL
     278        GROUP BY fl.listing_id
     279    ),
     280
     281    content_candidates AS (
     282        SELECT
     283            l2.listing_id,
     284            COUNT(*) AS content_score
     285        FROM my_recent_likes r
     286                 JOIN listings l1 ON l1.listing_id = r.listing_id
     287                 JOIN animals a1  ON a1.animal_id = l1.animal_id
     288
     289                 JOIN listings l2 ON l2.listing_id <> l1.listing_id
     290                 JOIN animals a2  ON a2.animal_id = l2.animal_id
     291
     292                 LEFT JOIN my_likes ml ON ml.listing_id = l2.listing_id
     293        WHERE ml.listing_id IS NULL
     294          AND (
     295            a2.species = a1.species
     296                OR a2.breed = a1.breed
     297                OR a2.located_name = a1.located_name
     298            )
     299        GROUP BY l2.listing_id
     300    ),
     301
     302
     303
     304    merged AS (
     305        SELECT
     306            COALESCE(cf.listing_id, cc.listing_id) AS listing_id,
     307            COALESCE(cf.cf_score, 0)              AS cf_score,
     308            COALESCE(cf.liked_by_similar_users, 0) AS liked_by_similar_users,
     309            COALESCE(cc.content_score, 0)         AS content_score
     310        FROM cf_candidates cf
     311                 FULL OUTER JOIN content_candidates cc
     312                                 ON cc.listing_id = cf.listing_id
     313    )
    310314
    311315SELECT
    312   l.listing_id,
    313   l.title,
    314   l.species,
    315   l.breed,
    316   l.location,
    317   l.created_at,
    318 
    319   m.cf_score,
    320   m.liked_by_similar_users,
    321   m.content_score,
    322 
    323   (m.cf_score * 3 + m.content_score * 2) AS final_score
     316    l.listing_id,
     317    a.name AS title,
     318    a.species,
     319    a.breed,
     320    a.located_name AS location,
     321    l.created_at,
     322
     323
     324    m.cf_score,
     325    m.liked_by_similar_users,
     326    m.content_score,
     327
     328    (m.cf_score * 3 + m.content_score * 2) AS final_score
    324329
    325330FROM merged m
    326 JOIN listings l ON l.listing_id = m.listing_id
     331         JOIN listings l ON l.listing_id = m.listing_id
     332         JOIN animals  a ON a.animal_id = l.animal_id
    327333WHERE l.status = 'ACTIVE'
    328334  AND l.owner_id <> :user_id
    329335ORDER BY final_score DESC, l.created_at DESC
    330336LIMIT 20;
    331 
    332337}}}
    333338=== Relation Algebra