在一个相当简单的tag_map中,
CREATE TABLE tag_map
(
article_id int(11) unsigned NOT NULL,
tag_id int(11) unsigned NOT NULL,
INDEX(tag_id),
PRIMARY KEY(article_id,tag_id)
) ENGINE=InnoDB;我如何检查哪一篇文章给出了这张表中的标签对?
CREATE TABLE tag_pairs
(
pair_id int(11) unsigned NOT NULL,
tag1 int(11) unsigned NOT NULL,
tag2 int(11) unsigned NOT NULL,
UNIQUE INDEX(tag1,tag2),
INDEX(tag2),
PRIMARY KEY(pair_id)
) ENGINE=InnoDB;在示例小提琴中,预期的输出是:
SELECT article_id,pair_id FROM ... (how to JOIN here)
1 5
1 7
3 6效率是最重要的,因为表格相当大。
因为tag_map很大,所以我避免使用JOIN。目前,我为每一个SELECT pair_id,
SELECT article_id, 5
FROM tag_map
WHERE tag_id IN(22,23)
GROUP BY article_id
HAVING SUM(IF(tag_id=22,1,0))>0 AND SUM(IF(tag_id=23,1,0))>0;这是没有效率的。
发布于 2022-07-21 21:32:34
您的问题是这个问题的一个变体:如何过滤SQL导致的有-多通关系。。阅读这个问题和解决这个有趣问题的许多(和不同的)方法。
令人惊讶的是,对于更普遍的问题,有一个简单得多的解决方案--它涉及一个三角形连接:
select
t1.article_id,
p.pair_id
from
tag_map as t1
join
tag_map as t2
on t1.article_id = t2.article_id
join
tag_pairs as p
on p.tag1 = t1.tag_id
and p.tag2 = t2.tag_id ;发布于 2022-07-23 00:14:27
SELECT m1.article_id, m1.tag_id, m2.tag_id
FROM tag_map AS m1
JOIN tag_pairs AS p ON p.tag1 = m1.tag_id
JOIN tag_map AS m2 ON p.tag2 = m2.tag_id
WHERE m2.article_id = m1.article_id;我把tag_pairs改成了
UNIQUE INDEX(pair_id),
INDEX(tag2),
PRIMARY KEY(tag1,tag2)但我宁愿完全摆脱pair_id。
https://dba.stackexchange.com/questions/314703
复制相似问题