我正在使用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 .= ")";
此方法存在的问题是,可能存在数千个与用户关联的组,这会使此代码运行速度非常慢且超时。有没有其他方法可以使用一个查询?
答案 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')