2012-01-01 100 views
1

因此該項目在PHP做一個簡單的CMS。您有帖子,類別和標籤。它將處理一個數據庫中數百萬個帖子,數百萬個標籤和類別。的MySQL需要幫助定義SQL刪除不需要的行

問題: 理想情況下,你希望能夠選擇30個職位必須是在5類和標籤1和2.你希望它在儘可能少的查詢儘可能做...

termRelations包含帖子ID和術語ID,termTypeId區分cat和tags表。
包含術語ID和分類信息(姓名,蛞蝓等)
標籤包含術語ID和標籤信息(姓名,蛞蝓等)

貓和標籤都是單獨的表,以便於加快生成一個類別列表/更單獨地定義它們。

SELECT DISTINCT * 
FROM posts 
LEFT JOIN termRelations ON (posts.id = termRelations.postId) 
LEFT JOIN cats ON (termRelations.termId = cats.id AND termRelations.termTypeId = 1) 
LEFT JOIN tags ON (termRelations.termId = tags.id AND termRelations.termTypeId = 0) 
WHERE cats.id =5 
OR tags.id =2 
OR tags.id =1 
LIMIT 0 , 30 

在這種情況下,它爲一個帖子返回3行,前兩個標籤字段添加,最後一個帶有類別字段。

我並不需要這些信息的使用(當涉及到多個標籤或類別一行作爲看似不可能,也許不是?),我只需要抓住下這三個條件的職位。但是,如果我可以通過一個最適合的查詢獲得類別和標籤信息。

謝謝。這與我的大腦有關。如果我做錯了什麼,而且你知道更有效的方法,那麼我會很樂意重新構建數據庫。

+0

我能看到的第一個錯誤是WHERE cats.id = 5 OR tags.id = 2 OR tags.id = 1 ...讓它在哪裏cats.id = 5 AND(tags.id = 2 OR標籤。 id = 1) – 2012-01-01 05:36:39

+0

不幸的是我試過這個,結果沒有行,所以我切換到OR。 – Turtleface 2012-01-01 06:17:09

+0

這意味着您的查詢是wrong..anyways..temme這個「術語」 ..沒有後有一個以上的長期多? – 2012-01-01 06:25:49

回答

1

上的選擇所有列DISTINCT作品等有您選擇的一切,將返回的每個不同行,而不僅僅是不同的職位。爲了避開這個你可以只選擇從職位表中的數據,然後它DISTINCT,即

SELECT DISTINCT posts.* 

但你也說你會喜歡的訊息和貓的信息,以及如果可能的話。要做到這一點,保證每一個後一行的一種方法是使用GROUP_CONCAT所以您的查詢可能最終會是這樣的。

SELECT 
    posts.*, 
    GROUP_CONCAT(cats.id SEPARATOR ',') as catsList, 
    GROUP_CONCAT(tags.id SEPARATOR ',') as tagsList 
FROM posts 
INNER JOIN termRelations ON (posts.id = termRelations.postId) 
LEFT JOIN cats ON (termRelations.termId = cats.id AND termRelations.termTypeId = 1 AND cats.id =5) 
LEFT JOIN tags ON (termRelations.termId = tags.id AND termRelations.termTypeId = 0 AND 
    (tags.id =2 
    OR tags.id =1) 
) 
GROUP BY posts.id 
LIMIT 0 , 30 

我做了幾個其他更改您喜歡改變先加入一個INNER JOIN並加入貓/標籤過濾器,爲相關的表連接條件原始查詢。

PS時,你說你有貓和標籤單獨的表,加快生成列表,你會發現,這是正確索引一個表是一樣快,也將簡化代碼。

+0

就是這樣。我知道有一種方式,你已經啓發我:D!我想我會在合併貓和標籤表時採納你的建議 - 我最初把它們合併爲「條款」,有時間進行重新編碼,如我所知,它最終會簡化。謝謝。 – Turtleface 2012-01-01 12:02:43

+0

這就是爲什麼在這裏;-)你可能喜歡投我的答案,並接受它。 – liquorvicar 2012-01-01 14:07:57

+0

聲望不夠,需要7個以上,哈哈。將不得不回到它:) – Turtleface 2012-01-01 22:20:23