【问题标题】:Using MySQL many to many select statement to find relative rows使用 MySQL 多对多 select 语句查找相关行
【发布时间】:2014-11-23 07:07:43
【问题描述】:

我尝试使用内连接来查找相关行。

但似乎它什么也没返回。请指教。

基本上,我已经从每篇文章的原始页面标题和描述中分解了所有关键字。所以,当我来搜索时,我可以查询关键字表。

这是一篇带关键词的文章

-- 表架构

CREATE TABLE article         ( id INT, title TEXT, description TEXT );
CREATE TABLE keyword         ( id INT, keyword VARCHAR(255) );
CREATE TABLE article_keyword ( article_id INT, keyword_id INT );

-- 增加第1条

insert into article set
id = 1,
title = "my text book like a black hole",
description = "I have a text book. Any people who read it and after days they will disappear. etc...";

--为文章1添加关键字

insert into keyword set
id = 1,
keyword = "text book";

insert into keyword set
id = 2,
keyword = "black hole";

insert into article_keyword set
article_id = 1,
keyword_id = 1;

insert into article_keyword set
article_id = 1,
keyword_id = 2;

-- 添加第2条

insert into article set
id = 2,
title = "the fact of deep space black hole",
description = "More researches are telling fake story about black holes is exists. But my alien friend tell me it is wrong ... etc";

--为文章2添加关键字

insert into keyword set
id = 3,
keyword = "research";

insert into keyword set
id = 4,
keyword = "alien";

insert into article_keyword set
article_id = 2,
keyword_id = 2;

insert into article_keyword set
article_id = 2,
keyword_id = 3;

insert into article_keyword set
article_id = 2,
keyword_id = 4;

-- 使用“教科书”查找,预期1篇

SELECT article.id, title FROM article
JOIN article_keyword ak ON ak.article_id = article.id
JOIN keyword k1         ON ak.keyword_id = k1.id
WHERE k1.keyword = "text book"

-- 使用“黑洞”寻找,预计2篇

SELECT article.id, title FROM article
JOIN article_keyword ak ON ak.article_id = article.id
JOIN keyword k2         ON ak.keyword_id = k2.id
WHERE k2.keyword = "black hole"

-- 当搜索一本书包含所有这些关键字时,则没有。

SELECT article.id, title FROM article
JOIN article_keyword ak ON ak.article_id = article.id
JOIN keyword k1         ON ak.keyword_id = k1.id
JOIN keyword k2         ON ak.keyword_id = k2.id
WHERE k1.keyword = "text book"
AND   k2.keyword = "black hole";

知道mysql不能把第1条还给我吗?

这个查询有什么问题吗?

谢谢!

【问题讨论】:

    标签: mysql many-to-many inner-join


    【解决方案1】:

    是的,您的查询是错误的,因为第一个 where 子句将 article_keyword 和关键字 (k1) 之间的连接限制为关键字 = 1 和 article_id = 1 的行,并且没有任何行将匹配关键字 2 的第二个 where 子句。

    如果您想要包含多个关键字的文章,您可以使用此查询:

    SELECT article.id, title 
    FROM article
    JOIN article_keyword ak ON ak.article_id = article.id
    JOIN keyword k          ON ak.keyword_id = k.id
    WHERE k.keyword = "text book"
    OR    k.keyword = "black hole"
    GROUP BY article.id, title
    HAVING COUNT(keyword) = 2
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2011-09-18
      相关资源
      最近更新 更多