我不知道什么是你的目标,但这里是一些样品:
SELECT u.id, u.firstname, sender, recipient, post_id, type
FROM events e
inner join users u
ON (e.sender = $id) -- why you need additional table there?
inner join post_list p
ON (e.post_id = p.post_id)
又如:
SELECT u.id, u.firstname, sender, recipient, post_id, type
FROM events e, users u, connection c, post_list p
where
e.sender=u.id AND
e.post_id=p.post_id AND
u.id=c.subscribed AND
u.id=$id
末寻求将返回所有表的Cartesian product和“过滤器”只有正确的,你可以安全地用JOIN语法替换上面的查询(请注意表顺序):
SELECT u.id, u.firstname, sender, recipient, post_id, type
FROM events e
inner join post_list p
ON (e.post_id = p.post_id)
inner join users u
ON (e.sender = u.id AND u.id=$id)
inner join connection c
on (u.id = c.subscribed)
---- UPDATE
这里是正确的查询:
select u.id, u.firstname, e.sender, e.recipient, e.type
from users u inner join events e on (u.id=.e.sender) -- this query return ALL events
-- next part "filters" results
where
u.id in (select subscribed from connection where subscribing=$id)
,你也可以在ON子句
select u.id, u.firstname, e.sender, e.recipient, e.type
from users u inner join events e on (u.id=.e.sender and u.id in (
select subscribed from connection where subscribing=$id))
移动过滤条件出于性能的考虑,我建议用另一种变体:
select e.* from events e
where e.sender in (select c.subscribing from connection c where c.subscribed=$id)
这个查询返回所有事件,没有用户的信息。所有的用户应该存储在memcache(例如)和输出到页面期间,你可以添加用户的名字,头像等
也,你可以通过PHP循环结果,并获得应该显示的用户列表,并获取从数据库只有适合自己的,有时这会更快的信息,尝试基准所有变体
你能提供的样本数据和预期的效果? – sgeddes
@sgeddes我刚刚编辑我的问题,使其更简单,更清晰。 –