2014-10-11 41 views
1

所以我有两个MySQL查询,如果我有知识结合我会,但我不这样,这就是为什么我转向“所以”,在那种情况下,我没有尝试任何事情,因为它超出了我的范围。我想将所有查询结合在一起,如果这不可能,请告诉我。我如何结合2复杂的MySQL查询

查询一个“此选择你的朋友的帖子,包括你的”:

"SELECT b.*, c.photo, d.name, e.status 
FROM post b 
INNER JOIN profile c 
INNER JOIN user d 
INNER JOIN user_friendship e 
ON b.from_user = c.user_id 
AND b.from_user = d.id 
AND e.friend_id = b.from_user 
WHERE e.status = :status 
AND e.user_id = :id 
ORDER BY b.id DESC LIMIT 20" 

查询两个“这将选择所有的人你下面的帖子”:

"SELECT b.*, c.photo, d.name, e.status 
FROM post b 
INNER JOIN profile c 
INNER JOIN user d 
INNER JOIN user_follower e 
ON b.from_user = c.user_id 
AND b.from_user = d.id 
AND e.to_id = b.from_user 
WHERE e.status = :status 
AND e.who_id = :id 
ORDER BY b.id DESC LIMIT 20" 

我已经联合这些,但只有PHP。我想在一个单一的MySQL查询中将两者结合起来。在此先感谢

+0

如何使用简单的'联盟/联盟所有'? – 2014-10-11 08:02:00

+0

@JoachimIsaksson仍然不熟悉,但自第一个答案使用,我想我将不得不使用该 – 2014-10-11 08:03:55

回答

2
SELECT * 
FROM 
    (SELECT b.*, 
      c.photo, 
      d.name, 
      e.status 
    FROM post b 
    INNER JOIN profile c 
    INNER JOIN USER d 
    INNER JOIN user_friendship e ON b.from_user = c.user_id 
    AND b.from_user = d.id 
    AND e.friend_id = b.from_user 
    WHERE e.status = :status 
    AND e.user_id = :id LIMIT 20 
    UNION SELECT b.*, 
       c.photo, 
       d.name, 
       e.status 
    FROM post b 
    INNER JOIN profile c 
    INNER JOIN USER d 
    INNER JOIN user_follower e ON b.from_user = c.user_id 
    AND b.from_user = d.id 
    AND e.to_id = b.from_user 
    WHERE e.status = :status 
    AND e.who_id = :id LIMIT 20) MainQuery 
ORDER BY id DESC 
+0

我想你可以在'UNION'本身之外添加'ORDER BY',我怀疑你可能会失去否则排序。 – 2014-10-11 08:03:44

+0

无所谓,我会用时间戳组织php @JoachimIsaksson – 2014-10-11 08:05:15

+0

只需添加collumn来确定从查询结果和排序。祝你有个美好的一天:) – VoonArt 2014-10-11 08:08:45

2
SELECT b.*, c.photo, d.name, e.status, "P" 
FROM post b 
INNER JOIN profile c 
INNER JOIN user d 
INNER JOIN user_friendship e 
ON b.from_user = c.user_id 
AND b.from_user = d.id 
AND e.friend_id = b.from_user 
WHERE e.status = :status 
AND e.user_id = :id 
ORDER BY b.id DESC LIMIT 20 
UNION 
SELECT b.*, c.photo, d.name, e.status, "F" 
FROM post b 
INNER JOIN profile c 
INNER JOIN user d 
INNER JOIN user_follower e 
ON b.from_user = c.user_id 
AND b.from_user = d.id 
AND e.to_id = b.from_user 
WHERE e.status = :status 
AND e.who_id = :id 
ORDER BY b.id DESC LIMIT 20 

有了额外的列,你可以看到该行从(P =后,F =以下)

未来记住,工会将消除重复行。如果你想看到所有的行使用UNION ALL

+0

感谢您的回答,我收到的两个答案都是正确的,并帮助我。不幸的是,我不得不采取其他答案,因为它是第一次,但我仍然赞成你的答案,再次感谢巴里 – 2014-10-11 09:30:13