2013-10-10 43 views
0

编辑:我已经编辑了这个问题。多个WHERE子句查询不起作用

这里,$ id = $ _SESSION ['id']并且让我们说$ id = 1(Paul)。

活动

sender recipient  type 

    1   2   message 
    2   4   like 

USERS

id  firstname 
    1   paul 
    2   anna 

连接

subscribing subscribed 
    1   2 

下面是我在目前位置:

SELECT events.sender, events.recipient, events.type, users.firstname, users.lastname, 
connection.subscribing, connection.subscribed 
FROM events, users, connection 
WHERE events.sender=users.id 
AND connection.subscribing =$id` 

此查询的目标是由于用户1(Paul)订阅了她的订阅源(在连接列表中),所以此订户的用户2(Anna)的JOIN事件和信息为。用户1应该只看到来自用户的事件+信息他已订阅(这里,安娜只)

当前查询不起作用,原因如下:

1)行是重复

2)无论$ id的值如何,来自表events的所有行都显示出来:过滤器 不起作用。

任何想法如何解决它?

+0

你能提供的样本数据和预期的效果? – sgeddes

+0

@sgeddes我刚刚编辑我的问题,使其更简单,更清晰。 –

回答

1

我不知道什么是你的目标,但这里是一些样品:

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循环结果,并获得应该显示的用户列表,并获取从数据库只有适合自己的,有时这会更快的信息,尝试基准所有变体

+0

+1,我编辑了我的问题,因为我意识到我没有解释得很好。如果你能看一看就会很棒。 –

+0

@ChHr检查更新的答案 –

+0

非常好的答案,谢谢你的明确解释。现在就像一个魅力! –

1

如果我正确理解你的问题,表模式,这应该为你工作:

select u.id, u.firstname, 
    e.sender, e.recipient, e.post_id, e.type, 
    pl.post 
from events e 
    join users u on e.sender != u.id 
    join connection c on c.subscribed = e.sender 
    join post_list pl on e.post_id = pl.post_id 
where e.sender = $id 

我不正确理解你与事件和用户之间的关系,但这应该让你朝着正确的方向前进。

+0

+1,我编辑了我的问题,因为我意识到我没有解释得很好。如果你能看一看就会很棒。 –