从键值表中选择所有条件匹配的行

时间:2015-11-07 20:58:11

标签: mysql sql

我有以下查询:

select *
    from user_interests
    join interests using(interest_id)
    where tag in('running', 'biking')
    and user_id != 1;

注意: in()值是使用php动态构建的,因此它们可以是一个值或100个值,每个值都通过用户浏览器$_GET传入。

我的user_interests表非常简单,因为它只是interest_iduser_id的列表。

CREATE TABLE `user_interests` (
  `interest_id` INT(10) UNSIGNED NOT NULL,
  `user_id` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`interest_id`, `user_id`)
);

我的兴趣表是一个简单的表格,其中包含不同类型的兴趣列表(runningbiking等)。

CREATE TABLE `interests` (
  `interest_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `tag` VARCHAR(50) NOT NULL,
  `category_id` TINYINT(3) UNSIGNED NOT NULL,
  PRIMARY KEY (`interest_id`),
  UNIQUE INDEX `tag` (`tag`)
);

由于每个用户都有很多兴趣,我如何在数据库中搜索列表中具有所有兴趣的用户。对于上面的查询,runningbiking。我的查询只是让那些至少拥有上述内容之一的人,如何才能使其获得具有所有查询权益的用户?

因此,如果用户有5个兴趣,并且我传入2并且他们在5个列表中有2个,那么应该返回他们的个人资料。如果他们只传递2个中的1个,那么不应该返回个人资料。

这是一个小提琴:http://sqlfiddle.com/#!9/29ea2

1 个答案:

答案 0 :(得分:1)

我会尝试

SELECT *
FROM user_interests
WHERE user_interests.user_id IN (
            SELECT ui.user_id
            FROM user_interests ui
            left join interests i using(interest_id)
            WHERE i.tag IN ($php_array)
                                ^ PHP
            and ui.user_id != 1
            GROUP BY ui.user_id
            HAVING COUNT(i.tag) >= count($php_array)
                                  ^ PHP
)

Fiddle