我一直在尋找所有的網,要求人們爲指導,但似乎沒有人知道正確的(相對較快的)問題的解決方案:MySQL的許多一對多的補集
我有三個表,經典多到許多解決方案:
entries
:ID(INT),標題(VARCHAR [255]),內容(文字)tags
:ID(INT),名稱(VARCHAR [255]) ,slug(varchar [255])entries_tags
:id(int),entry_id (int),tag_id(int)
到目前爲止沒有什麼不尋常的。現在,讓我們說我有標籤的測試數據(我保持了蛞蝓,因爲它們並不重要):
ID | name
1. | one
2. | two
3. | three
4. | four
5. | five
我也有三項:
ID | title
1. | Something
2. | Blah blah blah
3. | Yay!
而且關係:
ID | entry_id | tag_id
1. | 1 | 1
2. | 1 | 2
3. | 2 | 1
4. | 2 | 3
5. | 3 | 1
6. | 3 | 2
7. | 3 | 3
8. | 4 | 1
9. | 4 | 4
好的,我們有我們的測試數據。我想知道如何獲取所有具有標籤One的條目,但沒有標籤Three(即條目1和條目4)。
我知道如何用子查詢來做,問題是,它需要很多時間(大約10到15秒需要10萬個條目)。有沒有辦法用JOIN做到這一點?或者我錯過了什麼?
編輯我想我應該提到我需要一個能夠處理數據集而不是單個標籤的解決方案,所以用'One','Two'和'Two'替換我的問題中的'One' 'Three','Four'
edit2提供的答案是正確的,但實際上它太慢了。我想讓它工作的唯一方法是使用像Lucene或ElasticSearch這樣的第三方搜索引擎。
在之前的三分之一時間內(約5秒)做到了這一點,我想這就是在不緩存結果並做出某種魔術巫術技巧的情況下所能獲得的最多。非常感謝! – d4rky
隨時歡迎您!其實,還有一個想法,我已經更新了我的答案及其實施。你可以試試看嗎? –