需要有关从DB检索数据的建议

时间:2012-09-08 13:04:56

标签: php mysql database

我有一个带有2个表的MySQL数据库。 第一张表:

Posts                                    
ID                      
post_title                      
post_content 
... etc

带有附加数据的第二张表:

Postmeta
ID
Post_ID (FK)
meta_key
meta_value

我需要的数据是meta_key / value对。但是这个数据库的组织方式是第二个表中的每一行只有一条信息。

例如(第二张表):

ID      Post_ID   meta_key        meta_value
1          5      info                 30

ID      Post_ID   meta_key        meta_value
2          5      additional_info      40

ID      Post_ID   meta_key        meta_value
3          6      info                 50

ID      Post_ID   meta_key        meta_value
4          6      additional_info      60

所以如果我运行查询

SELECT 
posts.id, 
posts.post_date, 
posts.post_author, 
posts.post_content, 
posts.post_title, 
postmeta.meta_id, 
postmeta.meta_key, 
postmeta.meta_value

FROM posts INNER JOIN postmeta ON posts.id = postmeta.post_id

WHERE posts.post_type = 'post'

我收回了我需要的所有数据,但第一个表(ID / post_content等)的数据重复了很多次。 但我只需要第一个表中的数据一次,但第二个表中的所有附加数据都与第一个表中的ID相关。

我应该如何过滤所有这些东西?可能是一些php循环?

3 个答案:

答案 0 :(得分:1)

您可以使用mysql group_concat这样的功能:

select
    posts.id, 
    posts.post_date, 
    posts.post_author, 
    posts.post_content, 
    posts.post_title, 
    group_concat(postmeta.meta_id) as metaID, 
    group_concat(postmeta.meta_key) as metaKey, 
    group_concat(postmeta.meta_value_ as metaValue
from
    posts 
        INNER JOIN postmeta 
            ON posts.id = postmeta.post_id
where
    posts.post_type = 'post'
group by
    posts.id, 
    posts.post_date, 
    posts.post_author, 
    posts.post_content, 
    posts.post_title

要在PHP中拆分结果,您可以轻松使用爆炸函数来形成结果信息的数组。

答案 1 :(得分:0)

SELECT * FROM Posts, Postmeta 
WHERE Posts.Post_id = Postmeta.Post_id 
GROUP BY Posts.Post_id    

答案 2 :(得分:0)

使用SELECT DISTINCT代替SELECT