2011-07-12 78 views
0

在我的网站上,我尝试编写一个功能,用户可以选择从其他用户获取“更新”。当用户点击“接收更新”时,它会在数据库中引发用户ID,以及他们希望从中接收更新的其他用户。例如(4,5,6,7,8)。我的表是这样的使用WHERE IN使用MySQL查询的问题条款

members | updates 
----------------- 
    id | id 
updates | member_id 
     | content 
     | content_date 

当我查询我想拔出更新表只在成员已经指定用户更新的数据库:更新。

$sql_updates = mysql_query("SELECT * 
           FROM updates a, 
            members b 
          WHERE a.member_id IN b.updates 
          ORDER BY a.content_date DESC 
          LIMIT 10"); 

while($row = mysql_fetch_array($sql_updates)) { 

这是最好的方法吗?

+0

“b.updates”列是否将值存储为逗号分隔列表? –

+0

@dystopia:@Kerrek SB的回答是第一个,并且正确的 – gbn

回答

4

首先,正确拼写列名 - mem_idmember_id,它会是什么?其次,这只是一个简单的内连接:

SELECT members.id AS mem_id, updates, content, content_date 
FROM members JOIN updates ON(members.id = updates.member_id) 
ORDER BY content_date DESC 
LIMIT 10; 
+0

并不意味着mem_id在那里,而是快速输入它。谢谢! – dystopia

0
在MySQL

“IN”是喜欢“或”编程操作的,如果你正在起诉你需要提供b.updates不只列更新的数组或者使用子查询返回数组

$sql_updates = mysql_query(" 
SELECT * FROM updates a, members b 
WHERE a.mem_id IN (SELECT updates from members) 
ORDER BY a.content_date DESC LIMIT 10"); 

其他或更好的办法可以使用JOIN

$sql_updates = mysql_query(" 
SELECT * FROM updates a JOIN members b ON (a.mem_id = b.updates) 
ORDER BY a.content_date DESC LIMIT 10"); 
+0

谢谢!像魅力一样工作。 – dystopia

0

我会建议使用第三个表“订阅”,这将链接“成员”和“更新” TABL ES。

样本表结构:

subscriptions 
------------- 
id 
member_id 
update_id 

对于每个订阅(点击“接收更新”),您将创建在“预订”表中的一行。

0

如果in有意义,join可以给你额外的结果。通常我会推荐exists运算符,因为它与join一样执行,但会给出in的行为。以后可以使用distinct来保存自己。

$sql_updates = mysql_query("SELECT * 
           FROM updates a 
         where exists (select * from members b        
         WHERE a.member_id b.updates) 
          ORDER BY a.content_date DESC 
          LIMIT 10");