2012-01-06 166 views
0

我有两个表(Friends和News_Feed)。我需要从News_Feed表中检索最近的行(最高ID)。问题在于,我只想在News_Feed表中选择与Friends表中两列中任一列相关的行。我还需要通过News_Feed.id进行排序,因此创建两个查询(例如首先选择我的朋友,然后循环到News_Feed查询中)将不起作用。表设置如下:Mysql根据另一个表中的行选择不同的行

-Friends-
ID
用户
user_friending

News_Feed
ID
pertaining_user
动作
orig_comment

我现在,unworking查询,是...

$result = mysql_query("SELECT * FROM News_Feed WHERE pertaining_user=(SELECT user FROM Friends WHERE user_friending='37' AND is_confirmed='1' UNION SELECT user_friending FROM Friends WHERE user='37' AND is_confirmed='1') AND orig_comment='0' ORDER BY id DESC")or die(mysql_error()); 
while($row_news = mysql_fetch_array($result)){ 

这将返回子查询返回多行的错误,我明白了。必须有办法做到这一点。

+0

朋友表中有三列? – 2012-01-06 17:00:09

+0

是的。一个只有三列。该表只是在那里显示用户的朋友关系店 – dminicrick1 2012-01-06 17:01:43

+0

@ dminicrick1 - 那么'is_confirmed'从哪里来? – Eric 2012-01-06 17:04:22

回答

0

使用exists

select 
    * 
from 
    News_Feed f 
where 
    exists (
     select 
      1 
     from 
      friends u 
     where 
      (u.user = f.pertaining_user and u.user_friending = '37') 
      or (u.user_friending = f.pertaining_user and u.user = '37') 
      and u.is_confirmed = 1 
    ) 
order by 
    f.id desc 

这将是比试图做一个inunion快得多。它做了一个半连接并立即抛出无效行。

+0

埃里克,我试过你的查询,并不能得到它的工作。它只选择一个用户(37)并基于此显示。我实际上是在寻找相反的东西。 Konerak的解决方案效果很好,但效果并不尽如人意。关于如何适应你的工作和他一样工作的任何想法? – dminicrick1 2012-01-06 17:21:03

+0

我为你编辑了我的文档 - 刚开始的时候它刚刚获得了'37的'''''''''''。现在,它可以找到任何'user'或'user_friending'等于'37'的'friends'行,如果其中任何一个列匹配'belongsing_user',则返回。 – Eric 2012-01-06 17:27:10

+0

仍然无法正常工作。当它应该从Friends表中检索与所有用户37的朋友有关的News_Feed项目时,它仍然只检索与​​用户37有关的News_Feed项目。(拉出头发) – dminicrick1 2012-01-06 17:34:43

0

您可能正在寻找IN关键字。

SELECT * 
FROM News_Feed 
WHERE pertaining_user IN 
(
SELECT user 
FROM Friends 
WHERE user_friending='37' 
AND is_confirmed='1' 
UNION 
SELECT user_friending 
FROM Friends 
WHERE user='37' 
AND is_confirmed='1') 
AND orig_comment='0' 
ORDER BY id DESC 
相关问题