共有三个表:艺术、标签和用于标记每件艺术的链接表。
main_tags — 所有标签;
艺术——艺术;
tag_to_art - 标签和艺术之间的连接;
表中部分数据:
SELECT id, ru FROM main_tags ORDER BY id ASC LIMIT 5;
id | ru
----+-----------------
2 | мужчина
3 | девушка
4 | длинные волосы
5 | короткие волосы
6 | на улице
SELECT id FROM arts;
id
----
4
5
SELECT * FROM tag_to_art;
tag | art
----------------------+-----
девушка | 5
девушка | 4
длинные волосы | 5
на улице | 4
原来id为4的art有两个标签:女孩和街头,而art 5有女孩和长发。
您可以通过以下方式找到按 id 放置在单独艺术品上的所有标签:
SELECT main_tags.id, tag_to_art.tag
FROM main_tags
JOIN tag_to_art ON main_tags.ru = tag_to_art.tag
WHERE tag_to_art.art = '4';
id | tag
----+----------------------
6 | на улице
3 | девушка
通过这种方式,您可以了解标签被附加到不同艺术品上的次数:
SELECT COUNT(tag) FROM tag_to_art
WHERE tag = 'девушка';
count
-------
2
问题: 如何组合两个查询以获得如下输出:
id | tag | count
----+----------------------+-------
4 | длинные волосы | 1
3 | девушка | 2
我的尝试:
art_id = 4 # сюда приходит любой id по запросу
cur.execute(f"""SELECT main_tags.id, tag_to_art.tag, COUNT(tag_to_art.tag) AS count
FROM main_tags
JOIN tag_to_art ON main_tags.ru = tag_to_art.tag
WHERE tag_to_art.art = '{art_id}'
GROUP BY main_tags.id, tag_to_art.tag
ORDER BY count, date DESC
""")
data = cur.fetchall()
唉,这样几乎一切都是正确的,但它只计算标签在特定艺术品上使用的次数,而不是在整个表中。
id | tag | count
----+----------------------+-------
4 | длинные волосы | 1
3 | девушка | 1 # но здесь должно быть 2, оно подсчитало только на одном арте
我需要使用一个查询(可能带有子查询)或 Python 工具来使输出看起来符合要求。
小提琴