我的数据库中有模型(表),表和字段名称如下
tags (id, name)
taggings (id, tag_id, taggable_id, taggable_type, context)
employment_histories (id, user_id, grades, subjects, my_interests )
users (id)
taggable_id
实际上是 employment_histories_id
上下文可以是年级或科目或我的兴趣
现在我有标签数组,例如g={"9th","10th"} 我想获得用户,只有他们的标签都与上面的 g 数组匹配。
我在下面写了查询:
SELECT DISTINCT users.* FROM `users`
LEFT OUTER JOIN `employment_histories`
ON `employment_histories`.`user_id` = `users`.`id`
LEFT OUTER JOIN `taggings`
ON `employment_histories`.`id` = `taggings`.`taggable_id`
AND `taggings`.`taggable_type` = 'EmploymentHistory'
LEFT OUTER JOIN `tags` ON taggings.context = 'subjects'
WHERE tags.name='9th' OR tags.name='10th'
但它也给了我那些匹配任何标签的用户,但是我希望它只返回匹配所有两个标签的用户
假设第 9 和第 10 个标签的标签 ID 分别为 9 和 10 那么我希望它只返回 taggable_id(即 employmenthistories.id),它在标签中对这两个 tag_id(即 9 和 10)具有共同的 taggable_id表格
例如,我有两个用户 tariq 和 kamal,这两个用户都有第 9 个标签,但是 kamal 没有第 10 个标签,所以想要查询,如果通过这两个标签,应该只返回 tariq,其标签都与这两个标签相匹配,但用户像 kamal 这样匹配任何标签的也应该被过滤
最佳答案
来自 php chat room :
SELECT
users.* ,
count(*) AS count
FROM users
LEFT JOIN employment_histories ON users.id = employment_histories.user_id
LEFT JOIN tagging ON tagging.taggable_id = employment_histories.id
LEFT JOIN tags ON tags.id = tagging.tag_id
WHERE tags.name = "9th"
OR tags.name = "10th"
GROUP BY users.id
HAVING count = 2
关于mysql - mysql查询中的复杂搜索问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6306583/