根据另一个表中的关联在mysql数据库中选择行

时间:2010-12-18 21:37:46

标签: php mysql

我正在使用PHP和MySQL。

我有一个包含以下字段的表user_groups

id, userID, groupID

用户可以与多个组关联,因此如果我从此表中选择了特定的用户ID,那么我可以提出几个groupID

我有另一张表group_messages,其中包含以下字段

id, groupID, message

如果我想从group_messages表中选择其groupID与特定用户ID相关联的所有消息,我该如何编写此查询?我首先需要从user_groups表中选择所有groupID,其中userID是特定id,然后从group_messages中选择所有消息,其中groupID是我从user_groups表中选择的任何消息。

因此,我可以通过以下方式从user_groups表中选择所有groupID:

SELECT * FROM user_groups WHERE userID = '3'

这将返回一组groupID的

然后我需要只选择group_messages表中的那些消息,其中groupID在我从user_groups表中获取的数字集合中。

有一种方法可以通过一个查询执行此操作吗?我想也许我可以从user_groups表创建一个groupIDs数组,然后用foreach语句动态生成sql查询,如:

$sql = "SELECT * FROM group_messages WHERE (";

foreach ($groupID_array as $v){
  $sql .= "(groupID = '$v')or";   
}
$sql = rtrim($sql, 'or');

$sql .= ")";

此方法存在的问题是,可能存在数千个与用户关联的组,这会使此代码运行速度非常慢且超时。有没有其他方法可以使用一个查询?

1 个答案:

答案 0 :(得分:4)

使用IN运算符:

SELECT * FROM group_messages WHERE groupID IN (1,2,3,4);

如下面提到的9000,您可以在单个查询中进行此操作:

SELECT * FROM group_messages 
  WHERE groupID IN (SELECT groupID FROM user_groups WHERE userID = '3')