【发布时间】:2016-11-13 01:47:55
【问题描述】:
更新:更新问题以帮助人们更好地理解
我有以下表格
CREATE TABLE IF NOT EXISTS `post` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`heading` TEXT NOT NULL,
`content` LONGTEXT NOT NULL,
`date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`thumb` TEXT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB
AUTO_INCREMENT = 15
DEFAULT CHARACTER SET = latin1;
CREATE TABLE IF NOT EXISTS `tags` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`tagname` TEXT NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB
AUTO_INCREMENT = 12
DEFAULT CHARACTER SET = latin1;
DROP TABLE IF EXISTS `tagsinpost` ;
CREATE TABLE IF NOT EXISTS `tagsinpost` (
`tid` INT(11) NULL DEFAULT NULL,
`pid` INT(11) NULL DEFAULT NULL,
CONSTRAINT `post_ibfk_1`
FOREIGN KEY (`pid`)
REFERENCES `post` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `tagsinpost_ibfk_1`
FOREIGN KEY (`tid`)
REFERENCES `tags` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
CREATE INDEX `tagsinpost_ibfk_1` ON `tagsinpost` (`tid` ASC);
CREATE INDEX `post_ibfk_1` ON ``tagsinpost` (`pid` ASC);
其中tid 和pid 是标记id 和POST id 的外键
现在我想要的是根据任何帖子的标签获取相关帖子。 例如,如果某个 POST1 包含标签 T1、T2、T3、T4 和 POST2 包含标签 T2、T3、T4 和 POST3 包含 T1、T2 并且我正在搜索与 POST1 相关的帖子,那么我的输出应该是,
POST2 POST3
由于其中匹配的标签数量,请注意它们的顺序。目前我一直在寻找所有具有相同标签但没有顺序的帖子,我的查询将标签作为输入,应该是 POST id。
select distinct P.id, P.heading, P.date
from post as P, tags as T, tagsinpost as TP
where TP.tid=T.id
and TP.pid=P.id
and T.tagname in (
select distinct T.tagname from tags as T, tagsinpost
as TP where TP.pid = 20 and TP.tid = T.id
)
现在我如何按在第二个查询中找到的匹配 T.tagname 的数量来排序我的输出?
【问题讨论】:
-
请添加一些sql来创建表,插入一些虚拟数据,你期望的输出和你得到的输出。