Following up on my recent question about arbitrarily tagging rows in a
table, my website has certain pages that are tagged as 'Photos' and
other tags (http://www.punkish.org/Photos). The table schema is as
follows

TABLE pages (p_id INTEGER PRIMARY KEY, p_name TEXT);
TABLE tag (t_id INTEGER PRIMARY KEY, t_name TEXT);
TABLE pages_tags (p_id INTEGER, t_id INTEGER);

Given a parameter ? = 'current_tag'

Find all the non-'Photos' tags and their Counts for the pages that are
tagged as 'Photos' (tag_id = 1);
If the tag is the same as the 'current_tag', add a 'classtype' of
'tag_a', else 'tag_b' (the effect of the 'classtype' can be seen by
clicking on any of the tags and seeing the color of the relevant tags
change);


SELECT
    -- set 'classtype' to 'tag_a' or 'tag_b'
    CASE
        WHEN t.tag_id IN (
            SELECT DISTINCT tag_id
            FROM pages_tags
            WHERE page_id IN (
              SELECT p.page_id
              FROM pages p JOIN pages_tags pt ON p.page_id = pt.page_id
              WHERE pt.tag_id = ?
            )
        )
        THEN 'tag_a'
        ELSE 'tag_b'
    END AS classtype,
    t.tag_id,
    t.tag_name,
    Count(tag_name) AS tag_num

FROM tags t JOIN pages_tags pt ON t.tag_id = pt.tag_id

WHERE
    -- all tags that are not 'Photos'
    t.tag_id != 1 AND

    -- all pages that are tagged as 'Photos'
    pt.page_id IN (
        SELECT page_id FROM pages_tags WHERE tag_id = 1
    )

GROUP BY classtype, t.tag_id, tag_name
ORDER BY tag_name

Question: The above works just fine, but seems awfully convoluted,
which could be a result of my thinking too much about it.
Particularly, it seems the two nested SELECTs in the CASE clause would
be executed for each row in the result set. Could I do this more
elegantly?



-- 
Puneet Kishor http://www.punkish.org
Carbon Model http://carbonmodel.org
Charter Member, Open Source Geospatial Foundation http://www.osgeo.org
Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor
Nelson Institute, UW-Madison http://www.nelson.wisc.edu
-----------------------------------------------------------------------
Assertions are politics; backing up assertions with evidence is science
=======================================================================
Sent from Madison, WI, United States
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to