2015-11-07 63 views
0

匹配选择行我有以下查询:所有标准从键值表

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个,他们的个人资料应该被返回。如果他们中只有一个通过了,则不应退回配置文件。

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

+0

你的小提琴缺少表的用户 –

+0

我没加,因为他们真的有关...我已将其从查询问题中删除。 –

+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

+0

我在哪里告诉它要使用哪些兴趣? –

+0

哦,对不起,他们都认为他们。将编辑 –

+0

我已更改代码以反映 –