是否可以根据其中一个查询的结果将MySQL查询与多个表组合成一个查询?

时间:2013-07-07 16:37:51

标签: mysql

当前登录用户的$userid是PHP代码中当前可用的全部内容。我想对mysql表运行一个查询,以便为我自己和createddate DESC订购的朋友返回所有状态更新。

MySQL示例数据库表:

[的StatusUpdates]

statusupdateid int(8)  
ownerid int(8)
message varchar(250)
createddate datetime

[朋友]

friendid int(8)
requestfrom int(8)
requestto int(8)
daterequested datetime
dateupdated datetime
status varchar(1)

问题:我是否可以执行单个字符串查询,以返回statusupdates.userid订购的每个statusupdates.messagestatusupdates.createddate DESC

或者我是否必须针对friends$useridfriends.requestfrom所在的每个friends.requestto记录运行查询,然后为替换{{运行另一个查询1}}或friends.requestfrom(不包含friends.requestto的那个),然后按$userid对所有结果进行排序,然后获取statusupdate.createddate

2 个答案:

答案 0 :(得分:1)

你想看看MySQL连接。

我认为这可能会像你追求的那样,但几乎肯定需要调试!

SELECT DISTINCT s.ownerid, s.message 
FROM statusupdates s 
LEFT JOIN friends f ON ($userid = f.requestfrom) 
LEFT JOIN friends f ON ($userid = f.requestto)
ORDER BY s.createddate;

答案 1 :(得分:1)

这是未经测试的,但应该起作用或至少让你朝着正确的方向前进。

您可以使用IN()从子查询中获取userid的列表。该子查询对2个查询执行UNION - 第1个获取requestfrom userid,第2个获取requestto userids。最后,我们添加OR以包含当前userid.

另外,我认为您还想过滤掉status = 1的位置,因为您不希望那些尚未确认友情的人发布更新

SELECT s.ownerid, s.message 
FROM statusupdates s 
WHERE s.ownerid IN (
                   SELECT f1.requestfrom
                   FROM friends f1
                   WHERE f1.requestto = $userid
                   AND f1.status = 1

                   UNION

                   SELECT f2.requestto
                   FROM friends f2
                   WHERE f2.requestfrom = $userid
                   AND f2.status = 1
                   )
OR s.ownerid = $userid
ORDER BY s.createddate DESC

看看这个sqlFiddle示例 - http://sqlfiddle.com/#!2/85ea0/3