从表A中获取随机结果(如果它存在于表B中)并满足查询中的WHERE语句

时间:2015-08-31 18:54:45

标签: php mysql

我有两张桌子;一个表与用户,第二个表包含类别。

在网站的前端有一堆过滤器来过滤用户。其中一个过滤器是带有类别值的复选框的下拉列表。例如:可以选择管理员,用户,出版商等。

如果选中了多个复选框,则会从用户那里获取一个随机用户,但只有具有所有选定类别的随机用户。

用户拥有唯一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";

出于某种原因,这仅在选中一个复选框时有效。当第二个或更多被选中时,它会中断,没有错误,它只是根本找不到任何结果。

我希望我的问题很明确,如果您将来需要任何信息,请告诉我们!

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