【问题标题】:mysql query for related articlesmysql查询相关文章
【发布时间】:2012-02-20 05:43:05
【问题描述】:

我有以下表格:

  • 文章 (idArticle)
  • ArticleTag(idArticle、idTag)
  • 标签 (idTag)

我想获取与文章“5”具有相同标签的所有文章,我尝试如下:

SELECT DISTINCT Article.*
FROM Article
INNER JOIN ArticleTag ON Article.idArticle = ArticleTag.idArticle 
       AND ArticleTag.idArticle = "5"
WHERE 1 = 1
ORDER BY title
LIMIT 40

但它显示所有文章而不是相关文章。

【问题讨论】:

  • 你能发布你的表格列吗??
  • WHERE 1=1 没用——它会被优化掉。
  • you.re 对了,1=1 没用……而且表格只是文章(idArticle),文章标签(idArticle,idTag),标签(idTag)

标签: mysql sql


【解决方案1】:

试试

select a.* from Article a
inner join ArticleTag at
  on at.idArticle = a.idArticle
where at.idTag in (select idTag from ArticleTag where idArticle =5)

select a.* from Article a
inner join ArticleTag at on at.idArticle= a.idArticle
inner join ArticleTag at2 on at2.idTag = a.idTag and at2.IdArticle! = at.idArticle
where at2.idArticle = 5

【讨论】:

  • 它就像布赖恩的解决方案一样工作,问题在于性能......我想知道只使用 JOINS 的东西
  • 如何选择a.* from Article a 内连接ArticleTag at on at.idArticle= a.idArticle 内连接ArticleTag at2 on at2.idTag = a.idTag 和at2.IdArticle! = at.idArticle 其中 at2.idArticle = 5
  • 快到了...我在这里找到了解决方案stackoverflow.com/questions/3581023/…我会检查你的努力是否正确,谢谢!
【解决方案2】:
SELECT DISTINCT Article.*
FROM Article
INNER JOIN ArticleTag ON Article.idArticle = ArticleTag.idArticle 
WHERE ArticleTag.idTag IN 
(SELECT ArticleTag.idTag FROM ArticleTag WHERE ArticleTag.idArticle = '5')
ORDER BY Article.title
LIMIT 40;

【讨论】:

  • 是的 - 当你发表评论时正在修复它
  • 我将最后一个 ArticleTag.idTag 更改为 ArticleTag.idArticle... 它可以工作,但速度太慢,当我运行 EXPLAIN 时,它说索引是 ALL(性能真的很低)
  • OP 想要标签与文章 5 相同的文章,而不是标签 5。
  • 是的,它会很慢。您必须根据子查询生成的列表检查每一行。最好的线性搜索。
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
相关资源
最近更新 更多