2014-09-20 80 views
3

我有数据库这样的:多选结果在MySQL依赖于其它选择

schema

例如,一个用户请求的所有posts数据与posts.post_id = 1。现在,我想从其他表获得额外的数据:

  • 从表posts一些领域与post_id = 1
  • 所有的Fileds从表postmetapost_id = 1
  • 某些字段从表users依赖于posts.user_id其中post_id = 1
  • 来自表files的所有字段,它们与post_id = 1有关系
  • 某些字段从表terms,其中有一个关于post_id = 1

在PHP中我可以简单地运行5个查询来获取此信息,但我猜是因为MySQL是能够将此更快地执行,这是不是最好的方法。

更新细节:

这是我的查询运行用PHP来获取信息, database + data

有没有办法做到这一点只使用MySQL?

+2

你应该在SQL'JOIN's阅读起来。 – andy 2014-09-20 21:12:03

+2

我知道小MySQL'JOIN',我写查询但结果不太好,我得到4条记录,包含'posts'字段(重复4条记录)和'postmeta'字段。这对性能不利,对吧? – 123 2014-09-20 21:18:29

+2

请在给定样本中添加一些样本内容和所需结果,并说明为什么这是所需结果。 – VMai 2014-09-20 21:26:19

回答

3

单个查询并不总是优于多个查询。在这种情况下,我建议只合并你的1对1关系,但为你的多对一关系保留单独的查询,因为如果一个单独的文章有3个术语并且2个文件加入多对1关系会产生6行。

选择后,用户和postmeta数据

select * from posts p 
join postmeta pm on pm.post_id = p.post_id 
join users u on u.user_id = p.user_id 
where p.post_id = 1 

选择文件

select f.* from files f 
join file_relationships fr on fr.file_id = f.file_id 
join posts p on p.post_id = fr.post_id 
where p.post_id = 1 

选择方面

select t.* from terms t 
join term_relationships tr on tr.term_id = t.term_id 
join posts p on p.post_id = tr.post_id 
where p.post_id = 1 
+2

因为只有'用户'与'职位'有1 1关系,那么我已经运行4查询获取此数据? – 123 2014-09-20 22:05:07

+2

@ 123在这种情况下是的,会有4个查询 – FuzzyTree 2014-09-20 22:12:20

1

这应该是所有您需要的联接,根据需要修改SELECT列表。

select p.post_id, 
     p.post_title, 
     p.user_id, 
     u.user_name, 
     u.user_email, 
     pm.*, 
     f.* 
    from posts p 
    join postmeta pm 
    on p.post_id = pm.post_id 
    join users u 
    on p.user_id = u.user_id 
    join file_relationships fr 
    on p.post_id = fr.post_id 
    join files f 
    on fr.file_id = f.file_id 

*表示来自表的所有列与指定的别名。

+2

如果我使用'JOIN'我有10个或更多的重复列,这不利于性能,可能以其他方式获得该字段? – 123 2014-09-20 21:25:17

+2

你是指列或行吗? – VMai 2014-09-20 21:26:57

+2

你可以带回你想要的任何列。在你的问题中,你没有说你想要的列,你只是说“一些列”。要么修改选择列表以恢复所需的列,要么在您的问题中指定所需的列,然后将其更改为只返回那些列。 – 2014-09-20 21:27:01