2012-01-01 63 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