mysql - mysql查询中的复杂搜索问题

标签 mysql ruby-on-rails-3

我的数据库中有模型(表),表和字段名称如下

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/

相关文章:

mysql - 锁总数超过MySQL中的锁表大小

php - MySQL降序问题

jquery - Masonry 图像与 Rails 3 + Turbolinks + Mozilla 的重叠问题

javascript - 在 Rails 2.3.x 中获取 Rails 3 样式 UJS 的插件/Gem?

c# - 如何从 localstack 中的 Lambda 函数连接到 mysql?

mysql - 仅包含月份的日期列使用哪种数据类型

ruby-on-rails - 将 "complex"JSON 数据转换为散列

ruby-on-rails - 避免嵌套资源并仍然创建正确的引用

mysql - Rails 3.x MySQL 监视器/审查器

mysql - 显示此存储过程的注入(inject)攻击