我有以下查询:
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_id
和user_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`)
);
我的兴趣表是一个简单的表格,其中包含不同类型的兴趣列表(running
,biking
等)。
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`)
);
由于每个用户都有很多兴趣,我如何在数据库中搜索列表中具有所有兴趣的用户。对于上面的查询,running
和biking
。我的查询只是让那些至少拥有上述内容之一的人,如何才能使其获得具有所有查询权益的用户?
因此,如果用户有5个兴趣,并且我传入2并且他们在5个列表中有2个,那么应该返回他们的个人资料。如果他们只传递2个中的1个,那么不应该返回个人资料。
这是一个小提琴:http://sqlfiddle.com/#!9/29ea2
答案 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
)