使用WHERE IN子句使用MySQL查询的问题

时间:2011-07-12 01:37:40

标签: php mysql sql

在我的网站上,我正在尝试编写一个功能,用户可以选择从其他用户那里获取“更新”。当用户单击“接收更新”时,它会将数据库中的用户ID与他们希望从中接收更新的其他用户一起抛出。例如(4,5,6,7,8)。我的表看起来像这样

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)) {

这是最好的方法吗?

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

在Mysql中“IN”就像编程运算符的“OR”如果你在起诉你需要提供一个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");

答案 2 :(得分:0)

我建议使用第三个表“subscriptions”来链接“members”和“updates”表。

示例表结构:

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

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

答案 3 :(得分:0)

如果in有意义,联接可以为您提供额外的结果。通常我推荐使用exists运算符,因为它执行与连接相同的操作,但是给出了in的行为。稍后您可以使用不同的操作来保存自己。

$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");