mysql - 仅根据非唯一参数更新查询中的单行?
问题描述
我有一个带有重复键的大表,我试图将其连接到具有唯一键的较小表。我知道事实上不会有所有东西都匹配。我只希望我的小表中的匹配项更新大表中的单行,然后移动到下一个较小的表行进行下一次更新。我需要这样,因为我试图在更大的表中创建唯一的 id,因为每一行代表一个真实世界的产品,它有自己的真实世界对象的层次结构。
例如,
bigtable
barcodeSnippet t_stamp workId parentCase newId
aaaa time1 1 1 NULL
aaaa time1 1 1 NULL
aaaa time1 1 1 NULL
我的小桌子可能有这个
smalltable
id barcodeSnippet t_stamp workId parentCase
1 aaaa time1 1 1
2 aaaa time1 1 1
我想要在我的大表中的最终结果是
bigtable
barcodeSnippet t_stamp workId parentCase newId
aaaa time1 1 1 1
aaaa time1 1 1 2
aaaa time1 1 1 NULL
我每行只处理一次,并且留下了一个 NULL,因为我在大表中有 3 行,在我的小表中有两个匹配项。
我当前的查询
UPDATE bigtable as bt
JOIN smallTable as st ON (bt.barcodeSnippet = b.barcodeSnippet AND
bt.parentCase= st.parentCase and bt.t_stamp = st.t_stamp and bt.workId =
st.workId)
SET bt.bottlesId = st.id;
不起作用,而且我看不到在 MySQL 的 UPDATE 中使用 LIMIT 是可能的。我在 MS SQL 中看到了其他可以使用的答案TOP 1
,也许 newId 为 NULL,但我在这里再次使用 MySQL。
我在想我可能需要使用存储过程/游标方法,但即使这样,我似乎也会遇到必须运行更新语句的问题,然后我又回到了第 1 格。
有任何想法吗?使用 MySQL 5.6。
编辑:认为我有一个不错的解决方案。我刚刚更新了我的查询,所以我确实有重复。但是,现在我添加了一个行号列。如果行号<行号,我打算加入表并对其进行更新,因此我保留顶部ID并可以将其他ID设置为null,这是合适的。
像这样的东西
UPDATE bigtable tb
JOIN bigtable tb2 ON tb.newId = tb2.newId
SET tb.newId = NULL
WHERE tb.rowNumber < tb2.rowNumber;
解决方案
您将 auto_incremented id 列与 superglobal 一起使用$_GET
:
1.php
<?php $var = $row["id"]; ?>
<a href="2.php?id=<?php echo $var; ?>">Something</a>
然后在你的 2.php
<?php $id = $_GET["id"];
$sql = "SELECT * FROM table WHERE id='$id';";
当然你需要使用准备好的语句
推荐阅读
- docker - 如何使用用户命名空间配置启动容器?
- swift - SwiftUI iOS 13.3 嵌套在 TabView 中时缺少导航栏标题
- google-bigquery - 使用自动检测的动态 BigQuery 架构:错误架构没有字段
- jquery - Angular 5 和 jQuery:(点击)不调用函数
- facebook-php-sdk - 此端点需要“manage_pages”权限或“页面公共内容访问”功能”
- android-studio - 在 Kotlin 中我们应该使用什么来代替 GoogleApiClient?
- azure - 运行 Windows Server 的 Azure VM 未收到许可证激活响应
- android - 使用 kotlin 进行 Android 跌倒检测:ISSUE
- ruby - 拆分函数 NoMethodErrorException,因为我正在使用 Gherkin (Ruby) 循环遍历每个元素,但最后一个元素无效
- docker - 如何将卷映射到 WSO2 API Manager 容器?