我有两张桌子;一个表与用户,第二个表包含类别。
在网站的前端有一堆过滤器来过滤用户。其中一个过滤器是带有类别值的复选框的下拉列表。例如:可以选择管理员,用户,出版商等。
如果选中了多个复选框,则会从用户那里获取一个随机用户,但只有具有所有选定类别的随机用户。
用户拥有唯一ID。这些类别具有唯一的ID,类别值(管理员,发布者,用户等)和用户ID,因此我认为它可以捆绑在一起。
重要提示:
($value
=复选框中发布的值,同时请记住,categories.category = $value
部分是根据选择的数量动态添加的,我使用foreach附加了
我当前的查询:
$sql = "SELECT users.*, categories.*
FROM users
INNER JOIN categories
ON users.id = categories.user_id
WHERE categories.category = '$value' AND
categories.category = '$value'
--> continues endlessly depending on the amount of selections that have been made.
ORDER BY RAND()
LIMIT 0,1";
出于某种原因,这仅在选中一个复选框时有效。当第二个或更多被选中时,它会中断,没有错误,它只是根本找不到任何结果。
我希望我的问题很明确,如果您将来需要任何信息,请告诉我们!
答案 0 :(得分:0)
假设$values
是类别ID的数组(我假设整数),您可以运行如下查询:
SELECT
users.*
FROM
users
INNER JOIN
categories ON users.id = categories.user_id
WHERE
categories.category IN (" . implode(',', $values) . ")
GROUP BY
users.id
HAVING
COUNT(DISTINCT categories.category) >= " . count($values) . "
ORDER BY
RAND()
LIMIT 1
我做了example fiddle。
修改强>
如果类别是字符串,那么您需要确保正确引用,即将WHERE
更改为:
categories.category IN ('" . implode("','", $values) . "')
或者如果使用准备好的陈述(理想的话),您可以使用以下方式绑定implode(',', $values)
:
FIND_IN_SET(categories.category, ?) != 0