0

当前$userid登录的用户是 PHP 代码中当前可用的所有用户。我想对 mysql 表运行查询,以返回我自己和按createddate DESC.

MySQL 示例数据库表:

[状态更新]

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)

问题:我可以执行单个字符串查询,返回 eachstatusupdates.useridstatusupdates.messageorder bystatusupdates.createddate DESC吗?

或者我是否必须对在or then 中的每条friends记录运行查询,对alternate or (不包括的那个)运行另一个查询,然后对所有结果进行排序,然后得到?$useridfriends.requestfromfriends.requesttofriends.requestfromfriends.requestto$useridstatusupdate.createddatestatusupdates.message

4

2 回答 2

1

你想看看 MySQL Joins。

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

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;
于 2013-07-07T16:44:17.083 回答
1

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

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

另外,我假设您还想过滤掉 where 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

于 2013-07-07T17:07:13.713 回答