我正在尝试找到最快/更简单的方法来获得以下问题的结果。
我有一个(例如)乐高套件的数据库,其中每个套件都有描述和所需乐高积木的列表以及其中的数量。用户可以插入他的乐高积木收藏,然后询问他可以用他的积木搭建什么套件,以及如果他购买其他积木他还可以 build 什么(也许第一个限制是他只能购买一种类型的积木)。
我的大概是这样的:
LegoDesign
- id
- name
LegoBlock
- id
- type
- weight
- description
LegoBlockForDesign
- LegoDesign.id
- LegoBlock.id
- numberOfPiecesNeeded
Collection
(- User.id)
- LegoBlock.id
- quantityAvailable
例如,数据库包含 StarWar 死星的 LegoDesign。 LegoBlock 包含一长串零件,例如“2x2 黑色方 block ”或“小轮子”等。LegoBlockForDesign 将 LegoBlocks 分配给死星的 LegoDesign(例如 1000 个“2x2 黑色方 block ”)。 而 Table 集合包含用户拥有的部分。 现在这里的问题是我必须使用用户拥有的部件查询设计,这意味着首先检查 LegoBlock.id 然后检查 numberOfPiecesNeeded 因为我可以有一些 2x2 的黑色方 block 但不足以构建死亡星星。这是第一个查询。第二个应该检查包含我拥有的 block 以及我的集合中没有的一些 block 的设计。这意味着我应该检查我拥有的乐高积木,但数量少于正确数量,并检查设计中不属于我的积木。后者需要一个可以手动设置的限制。我正在考虑让用户在购买件数限制(即最多 30 件)或件难度限制(即没有“特殊 block ”购买,如一些特殊轮子或仅存在的角色)之间进行选择在特定设计中(例如星球大战中的角色)。
我不完全确定它可以在 SQL 中完成,特别是因为我必须检查数量而不仅仅是 block 的存在。
编辑: 我添加了 LegoBlock.type 和 LegoBlock.weight。这样我就可以定义 type = common,rare,unique 来定义普通部件或特定部件(比如可以定义为稀有的星球大战角色。我不想购买这些部件,因为它们只能用于 StarWars'设计)。 weight instead 可以用来给予优先级(我喜欢蓝色,所以我更愿意看到我必须购买蓝色件的设计)。
最佳答案
试试这个查询...这将为您提供 LegoDesigns,其中用户拥有所有积木和积木数量:
SELECT
c.id, c.name
FROM
Collection a
INNER JOIN
LegoBlockForDesign b ON
a.LegoBlock.id = b.LegoBlock.id AND
a.quantityAvailable >= b.numberOfPiecesNeeded
INNER JOIN
LegoDesign c ON b.LegoDesign.id = c.id
INNER JOIN
(
SELECT LegoDesign.id, COUNT(1) AS totalneeded
FROM LegoBlockForDesign
GROUP BY LegoDesign.id
) d ON c.id = d.LegoDesign.id
WHERE
a.User.id = <userid here>
GROUP BY
c.id, c.name, d.totalneeded
HAVING
COUNT(1) = d.totalneeded
编辑 2: 此查询将检索用户在给定当前收藏的情况下可以构建的所有设计以及用户选择的其他乐高积木 block ,这些积木 block 由希望购买的用户选择:
SELECT
a.id, a.name
FROM
(
SELECT
c.id, c.name, NULL AS notInCollection
FROM
Collection a
INNER JOIN
LegoBlockForDesign b ON a.LegoBlock.id = b.LegoBlock.id
INNER JOIN
LegoDesign c ON b.LegoDesign.id = c.id
WHERE
a.quantityAvailable >= b.numberOfPiecesNeeded AND
a.User.id = <userid here>
UNION ALL
SELECT
d.id, d.name, 1 AS notInCollection
FROM
LegoDesign d
INNER JOIN
LegoBlockForDesign e ON d.id = e.LegoDesign.id
WHERE
e.LegoBlock.id IN (<comma sepd list of legoblockids here>)
) a
INNER JOIN
(
SELECT LegoDesign.id, COUNT(1) AS totalneeded
FROM LegoBlockForDesign
GROUP BY LegoDesign.id
) b ON a.id = b.LegoDesign.id
GROUP BY
a.id, a.name, b.totalneeded
HAVING
COUNT(1) = b.totalneeded AND
COUNT(a.notInCollection) > 0
UNION ALL基本上附加在代表包含那些特定选定 block 的设计的行上,以便 HAVING COUNT(*)在外面可以考虑到它们。 notInCollection FROM 子选择中的字段是一个标志,指示该部件是否已经在用户的集合中...所以 HAVING COUNT(f.notInCollection) > 0不包括用户在他/她的收藏中已经拥有所有零件的设计。这比执行 NOT IN (<1st query as subquery>) 更有效率。你也可以这样做。
查询假定用户之前已经出现,并且只能从他/她还没有的 legoblocks 列表中进行选择,否则 UNION 中将出现重复,这将导致结果丢失。
您还可以放入一个 legoblockid 列表,这样用户就可以选择多个 legoblock,以查看随着他们选择更多积木,他们可以构建的设计数量越来越多。
关于mysql - 将乐高设计与件数和件数相匹配的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977332/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如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装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub