2011-05-09 32 views
0

我正在開發一個商店系統,並遇到搜索問題。搜索包含語言或性別的文章是沒有問題的,但我正在努力獲取僅包含選定文章的文章。MySQL查詢獲取僅包含所選語言的文章

這是使用的表的一個例子:

文章

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:Sry基因爲我的英語不好:(

回答

1

這可能不是最好的辦法,但它的工作原理。我的思考過程是我們要選擇只有一種語言的文章,所以首先我們應該找出每篇文章有多少種語言。我通過將article_languages的結果分組爲article_id並使用COUNT aggregate function生成'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; 
+0

哇這是我想要的:)希望會有一個比這更好的答案,但否則我會用它:) – theiNaD 2011-05-09 17:17:29

0

例如:

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'; 

如果你已經知道(在本例中1)語言ID將是:

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