我正在开发一个商店系统,但在搜索时遇到了问题。搜索包含语言或性别的文章没有问题,但我正在努力获取仅包含所选语言或性别的文章。
以下是所用表的示例:
文章
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;