gpt4 book ai didi

Mysql 内部连接管理 count() 行为

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:43 25 4
gpt4 key购买 nike

我有以下查询,它使用引用表 tags_titlestags_blogs 来与其中包含名为 tags 的标签的表进行比较。标签本身保存在 t.label 列中。

我的问题是有时 count() 过多的 total_matches。通常在 tags_titles 和 tags_blogs 中可以找到引用的标签。有什么方法可以使内部连接互斥,或者其他解决方案,以便与列 t.label 的实际匹配计数是准确的?

SELECT b.blog_id AS id, b.title AS title, b.body AS body, COUNT(t.label) AS total_matches, b.creation_time AS creation_time, '1' AS type
FROM tags AS t
INNER JOIN tags_titles AS tt
ON tt.tag_id = t.tag_id
INNER JOIN tags_blogs AS tb
ON tb.tag_id = t.tag_id
INNER JOIN blogs AS b
ON tt.blog_id=b.blog_id OR tb.blog_id=b.blog_id
WHERE t.label IN ($in) AND b.title IS NOT NULL
GROUP BY id, title, body, creation_time, type

最佳答案

您的问题是标题有一个标签列表,博客有一个标签列表,并且您得到的是每个博客的这些标签的笛卡尔积。

您的问题的简单解决方案是使用count(distinct):

SELECT b.blog_id AS id, b.title AS title, b.body AS body, COUNT(distinct t.label) AS total_matches,
b.creation_time AS creation_time, '1' AS type
FROM tags AS t
INNER JOIN tags_titles AS tt
ON tt.tag_id = t.tag_id
INNER JOIN tags_blogs AS tb
ON tb.tag_id = t.tag_id
INNER JOIN blogs AS b
ON tt.blog_id=b.blog_id OR tb.blog_id=b.blog_id
WHERE t.label IN ($in) AND b.title IS NOT NULL
GROUP BY id, title, body, creation_time, type;

在更复杂的场景中,您有时需要在联接之前独立地沿单独的维度进行聚合。

您还有另一个问题是t.label in ($in)。这不适用于 in。相反,您可以使用:

find_in_set(t.label, $in) > 0;

或者直接替换 SQL 中的列表。前一种方法不使用索引进行过滤。后者会(如果有合适的可用的话)。

关于Mysql 内部连接管理 count() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com