我正在创建带有过滤器和排序选项的数据表。我需要让那些在评论中带有“测试”一词的用户(例如)。因此,我首先进行了查询,以获取其中注释正文包含搜索词的所有user_id。然后使用这些ID仅返回那些用户。
此方法的问题是,如果我的数据库有数百万条记录,我将开始收到此错误。
无法执行以下SQL语句:SQLSTATE [HY000]:常规错误:7 参数的数量必须在0到65535之间。
还有另一种方法可以过滤结果吗?
用户表
id | username
1 jacko2
2 billyElf
3 crazyJack
user_comments表
id | user_id | comment_body
1 1 test comment
2 2 another one
3 1 hello world
4 3 testing 123
到目前为止,这是我的代码
$search_term = 'test'
$user_ids = query("SELECT user_id FROM user_comments WHERE comment_body LIKE '%$test%'")
$result = query("SELECT * FROM users WHERE id IN ($user_ids)")
答案 0 :(得分:1)
只需将查询合并为单一查询并使用EXISTS
:
SELECT u.*
FROM users u
WHERE EXISTS (SELECT 1
FROM user_comments uc
WHERE uc.user_id = u.id AND
uc.comment_body LIKE ?
);
您要使用EXISTS
而不是JOIN
,以防万一有多个用户具有多个匹配的注释。
?
是用于传递字符串值的占位符(您可能确实想要CONCAT('%', ?, '%')
。出于各种原因,应使用此类参数来传递此类值:
答案 1 :(得分:0)
您必须使用GROUP_CONCAT
$search_term = 'test'
$user_ids = query("SELECT GROUP_CONCAT(user_id) as user_id from user_comments where comment_body like '%$test%'")
$result = query("SELECT * FROM users WHERE id IN ($user_ids)")