我有一个包含 3 个表的数据库 - 产品、标签和产品标签。我需要一个查询 返回具有所有指定标签的所有产品。换句话说,不要返回 如果产品没有所有指定的标签,则该产品。
products
+----+-----+--------+------------------------+
| id | uid | name | description |
+----+-----+--------+------------------------+
| 1 | p1 | ball | something that bounces |
+----+-----+--------+------------------------+
| 2 | p2 | block | for building stuff |
+----+-----+--------+------------------------+
| 3 | p3 | bucket | holds stuff |
+----+-----+--------+------------------------+
| 4 | p4 | shovel | scoops stuff |
+----+-----+--------+------------------------+
tags
+----+-----+--------+
| id | uid | name |
+----+-----+--------+
| 1 | t1 | blue |
+----+-----+--------+
| 2 | t2 | red |
+----+-----+--------+
| 3 | t3 | green |
+----+-----+--------+
| 4 | t4 | yellow |
+----+-----+--------+
| 5 | t5 | orange |
+----+-----+--------+
product_tags
+-------------+---------+
| product_uid | tag_uid |
+-------------+---------+
| p1 | t1 |
+-------------+---------+
| p1 | t2 |
+-------------+---------+
| p2 | t3 |
+-------------+---------+
| p2 | t4 |
+-------------+---------+
| p2 | t5 |
+-------------+---------+
| p3 | t1 |
+-------------+---------+
| p4 | t1 |
+-------------+---------+
| p4 | t5 |
+-------------+---------+
Here are some examples of results I'm looking for:
选择红色的产品 (t2):
+-------------+------+
| product_uid | name |
+-------------+------+
| p1 | ball |
+-------------+------+
选择所有红色和蓝色的产品(t2,t1):
+-------------+------+
| product_uid | name |
+-------------+------+
| p1 | ball |
+-------------+------+
选择所有红色、蓝色和黄色的产品(t2、t1、t4):
+--------------------+
| NO PRODUCTS |
+--------------------+
选择所有蓝色的产品 (t1):
+-------------+--------+
| product_uid | name |
+-------------+--------+
| p1 | ball |
+-------------+--------+
| p3 | bucket |
+-------------+--------+
| p4 | shovel |
+-------------+--------+
选择所有蓝色和橙色的产品(t1、t5):
+-------------+--------+
| product_uid | name |
+-------------+--------+
| p4 | shovel |
+-------------+--------+
Here is a link to a SQLFiddle that's already set up. I tried a LEFT JOIN but it doesn't get me what I'm looking for.
最佳答案
编辑:根据@spencer7593 的建议更新
假设您的标签是唯一的,您可以使用计数来仅按命中次数等于传递的标签的产品进行过滤。
这种方法的优点是允许无限标签作为输入。
SELECT products.uid
FROM product_tags
JOIN products ON product_tags.product_uid = products.uid
WHERE product_tags.tag_uid IN ('t2', 't1')
GROUP BY products.uid
HAVING COUNT(DISTINCT product_tags.tag_uid) = 2
或者对于 3 个标签:
SELECT products.uid
FROM product_tags
JOIN products ON product_tags.product_uid = products.uid
WHERE product_tags.tag_uid IN ('t3', 't2', 't1')
GROUP BY products.uid
HAVING COUNT(DISTINCT product_tags.tag_uid) = 3
等等……
关于php - MySQL Select - 连接所有匹配的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47148607/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle