Mysql在庞大的数据库中加入了很多表

时间:2012-02-09 17:19:42

标签: php mysql database join

这是我在这里的第一篇文章。 我需要创建像facebook这样的Feed,其中包含许多信息,例如用户签到,照片,徽章等等......我需要帮助来创建一个查询才能执行此操作。我怎么能用这个创建一个连接?

select reviews.id_user, reviews.id, reviews.review
from reviews
where reviews.id_user in (1,2,3,4,5)
order by reviews.created_time desc;

select placespops.id_user, placespops.id, placespops.id_pop
from placespops
where placespops.id_user in (1,2,3,4,5)
order by placespops.created_time desc;

select usersfoursquarecheckins.id_user, usersfoursquarecheckins.id
from usersfoursquarecheckins
where usersfoursquarecheckins.id_user in (1,2,3,4,5)
order by usersfoursquarecheckins.created_time desc;

select usersfacebookcheckins.id_user, usersfacebookcheckins.id
from usersfacebookcheckins
where usersfacebookcheckins.id_user in (1,2,3,4,5)
order by usersfacebookcheckins.created_time desc;

select placesphotos.id_user, placesphotos.id
from placesphotos
where placesphotos.id_user in (1,2,3,4,5)
order by placesphotos.created_time desc;

select usersbadges.id_user, usersbadges.id
from usersbadges
where usersbadges.id_user in (1,2,3,4,5)
order by usersbadges.created_time desc;

问题是,如何在一个查询中加入所有内容?

2 个答案:

答案 0 :(得分:0)

在这种情况下,看起来最简单的方法就是结合结果集 - 就像这样:

select reviews.id_user, 
       reviews.created_time, 
       reviews.id review_id, 
       reviews.review, 
       null placespop_id, 
       null id_pop,
       null usersfoursquarecheckin_id,
       null usersfacebookcheckins_id,
       null placesphotos_id,
       null usersbadges_id
from reviews
where reviews.id_user in (1,2,3,4,5)
union all
select placespops.id_user, 
       placespops.created_time, 
       null review_id, 
       null review, 
       placespops.id placespop_id, 
       placespops.id_pop,
       null usersfoursquarecheckin_id,
       null usersfacebookcheckins_id,
       null placesphotos_id,
       null usersbadges_id
from placespops
where placespops.id_user in (1,2,3,4,5)
union all
select usersfoursquarecheckins.id_user, 
       usersfoursquarecheckins.created_time, 
       null review_id, 
       null review, 
       null placespop_id, 
       null id_pop, 
       usersfoursquarecheckins.id usersfoursquarecheckin_id,
       null usersfacebookcheckins_id,
       null placesphotos_id,
       null usersbadges_id
from usersfoursquarecheckins
where usersfoursquarecheckins.id_user in (1,2,3,4,5)
union all
select usersfacebookcheckins.id_user, 
       usersfacebookcheckins.created_time,
       null review_id, 
       null review, 
       null placespop_id, 
       null id_pop, 
       null usersfoursquarecheckin_id,
       usersfacebookcheckins.id usersfacebookcheckins_id,
       null placesphotos_id,
       null usersbadges_id
from usersfacebookcheckins
where usersfacebookcheckins.id_user in (1,2,3,4,5)
union all
select placesphotos.id_user, 
       placesphotos.created_time,
       null review_id, 
       null review, 
       null placespop_id, 
       null id_pop, 
       null usersfoursquarecheckin_id,
       null usersfacebookcheckins_id,
       placesphotos.id placesphotos_id,
       null usersbadges_id
from placesphotos
where placesphotos.id_user in (1,2,3,4,5)
union all
select usersbadges.id_user,
       usersbadges.created_time,
       null review_id, 
       null review, 
       null placespop_id, 
       null id_pop, 
       null usersfoursquarecheckin_id,
       null usersfacebookcheckins_id,
       null placesphotos_id,
       usersbadges.id usersbadges_id
from usersbadges
where usersbadges.id_user in (1,2,3,4,5)
order by 2 desc

答案 1 :(得分:0)

这样的事情怎么样:

    SELECT r.id_user rid_user, r.id rid, r.review
          , p.id pid, p.id_pop
          , ufsq.id_user ufsqid_user, ufsq.id ufsqid
          , ufbk.id_user ufbkid_user, ufbk.id ufbkik
          , pp.id_user ppid_user, pp.id ppid
          , ub.id_user ubid_user, ub.id ubid
       FROM reviews r
 INNER JOIN placespops p ON r.id_user = p.id_user
 INNER JOIN usersfoursquarecheckins ufsq ON r.id_user = ufsq.id_user
 INNER JOIN usersfacebookcheckins ufbk ON r.id_user = ufbk.id_user
 INNER JOIN placesphotos pp ON r.id_user = pp.id_user
 INNER JOIN usersbadges ub ON r.id_user = ub.id_user

      WHERE r.id_user IN (1,2,3,4,5)
   ORDER BY reviews.created_time desc;

这比巨大的UNION

更有效,更易于管理