MySQL-Query获取仅包含所选语言的文章


MySQL-Query to get articles with only the chosen language

我正在开发一个商店系统,但在搜索时遇到了问题。搜索包含语言或性别的文章没有问题,但我正在努力获取仅包含所选语言或性别的文章。

以下是所用表的示例:

文章

id   | int(11)  | Primary Key | auto_increment
name | tinytext |

语言

id   | int(11)  | Primary Key | auto_increment
lang | tinytext |

article_languages

article_id  | int(11) | Primary Key
language_id | int(11) | Primary Key

所以我现在想知道哪些文章有语言(例如英语),但没有其他文章(德语、土耳其语、西班牙语等)。尝试了很多事情,但从未得到正确的结果。

这是正确的数据库结构吗?如果是,如何选择正确的行。我的大脑正在杀死我...

希望这些信息足够了。

问候iNaD

PS:为我的英语:(不好而哭泣

这可能不是最好的方法,但它有效。我的想法是,我们想选择只有一种语言的文章,所以首先我们应该找出每篇文章有多少种语言。我通过按article_id对article_languages的结果进行分组并使用 COUNT 聚合函数生成"languages_count"来做到这一点。

您不能将 WHERE 子句与派生列一起使用(我认为 - 如果我错了,请纠正我),所以我将其包装为子查询,外部查询使用 WHERE 限制结果,并且还执行 JOIN 以获取实际文章。

因此,此查询将返回只有一种语言的所有文章,无论该语言是什么(我希望这就是您想要的,如果不参考其他答案):

SELECT a.* FROM (SELECT article_id,language_id,COUNT(article_id) AS languages_count FROM article_languages GROUP BY article_id) AS al LEFT JOIN articles AS a ON al.article_id = a.id WHERE al.languages_count = 1;

例如:

SELECT a.* FROM articles as a, languages as l, article_languages as al WHERE l.id = al.language_id AND a.id = al.article_id AND l.lang = 'ENGLISH';

如果您已经知道语言 ID(在本例中为 1),它将是:

SELECT a.* FROM articles as a, article_languages as al WHERE a.id = al.article_id AND al.language_id = 1;