- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我迷路了......我只是花了 3 个小时看这个,调整它,扭曲它,重写它,重新排列它,但我无法弄清楚。
我拥有的是多个表,我正在加入这些表来获取我需要的相关信息,显然......所以像这样(非常简化):
job_id | part_id | part_title | override | override_id
1 | 5 | part1 | 1 | 7
1 | 6 | part2 | 1 | 7
1 | 7 | part3_kit | 1 | NULL
1 | 8 | part4 | 1 | 9
1 | 9 | part5_kit | 1 | NULL
1 | 10 | part6 | 1 | NULL
1 | 11 | part7 | 1 | 15
前提很简单 - 有一个零件和零件套件的集合,其中零件套件包含特定零件(想想零件组)。
如果“override”字段已打开(= 1),那么我只想显示以下部分:1)没有“override_id”(override_id IS NULL)并且2)其他部分具有引用的这些部分的“part_id”在其“override_id”列中,并且 3) 可能在“override_id”列中具有值,但引用的“part_id”不在给定结果内,因此它们无法替换,也需要包含在内。
反之亦然,如果“覆盖”被关闭(= 0),那么我想显示所有不是套件的部件(套件=其他部件在“override_id”列中引用它们)。
因此,例如,如果 override = 1,则应列出的part_ids 7, 9 10, 11(7 和 9 在“override_id”列中被引用为套件,10 只是一个没有覆盖的零件引用/不是套件,11 是单个部件,其中引用了覆盖部件,但该部件不在现有结果列表中,因此该单个部件不会被套件替换,而是被包含在内)。
如果 override = 0,则应列出的部分 ID 为 5、6、9、10、11(同样,7 和 9 在这些特定结果的“override_id”列中被引用为套件,因此这些结果应该被省略,而 11 应该被包含,因为它的覆盖部分 id 15 不包含在结果中,因此第 11 部分不能被覆盖部分替换 - 它也需要被包含)。
注意:“覆盖”字段是通过 JOIN 从另一个外部表(全局设置为 0 或 1,绝不是两者的混合)中提取的,但为了论证和简单起见,我将其包含在此处此单个表的一部分。
这是我一直在尝试组合的查询,但我到处都遇到了障碍:
SELECT
j.job_id,
pt.part_id,
pt.part_title,
pt.override,
pt.override_id,
(SELECT
GROUP_CONCAT(DISTINCT pt.override_id)
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
AND pt.override_id IS NOT NULL) AS override_ids
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
AND pt.part_id NOT IN (
CASE pt.override
WHEN '1' THEN IF(pt.override_id IS NOT NULL, pt.part_id, NULL)
WHEN '0' THEN override_ids
END)
GROUP BY j.job_id, pt.part_title
ORDER BY pt.part_title;
对于上面的查询,我收到错误消息:
Error in query (1054): Unknown column 'override_ids' in 'where clause'
如果我将该 SELECT 子查询从顶部移至我的 CASE WHEN 部分:
SELECT
j.job_id,
pt.part_id,
pt.part_title,
pt.override,
pt.override_id
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
AND pt.part_id NOT IN (
CASE pt.override
WHEN '1' THEN IF(pt.override_id IS NOT NULL, pt.part_id, NULL)
WHEN '0' THEN (SELECT
GROUP_CONCAT(DISTINCT pt.override_id)
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
AND pt.override_id IS NOT NULL)
END)
GROUP BY j.job_id, pt.part_title
ORDER BY pt.part_title;
GROUP_CONCAT 返回一个字符串而不是整数列表,因此插入到父级 NOT IN (...) 中,它仅计算第一个值,而不是所有值。在这种情况下,它将返回 7,9,但只有 7 会在 NOT IN (...) 部分进行计算。
现在,如果我从子查询中删除 GROUP_CONCAT 并将其保留为 SELECT DISTINCT pt.override_id FROM... 我会收到一条错误消息:
Error in query (1242): Subquery returns more than 1 row
所以我只是迷失在这里......没有想法。
有人帮忙吗?
我希望我有更多的 MySQL 经验来解决这个问题,但到目前为止,我已经尽我所能和我的知识水平尝试了一切,3 小时后我已经接近最终目标了,但事实并非如此。
我错过了什么?
如果您发现该查询可以进一步优化或简化,请随时发表评论,同样,我仍在学习,我可能遗漏了一些对你们专家来说显而易见的东西......
提前致谢!
最佳答案
好吧,经过一个多小时的摆弄和移动东西之后,我已经成功地涵盖了所有条件并使查询能够正确评估。
这是我得到的最终查询,但请随意提出更优化的解决方案(感谢 FIND_IN_SET 建议,完全忘记了这个建议,因为这将采用 GROUP_CONCAT 字符串值并对其进行完全评估,这与 NOT IN 不同)。
SELECT
j.job_id,
pt.part_id,
pt.part_title,
pt.override,
pt.override_id
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
AND
CASE pt.override
WHEN '1' THEN IF(pt.override_id IS NULL,
pt.override_id IS NULL,
NOT FIND_IN_SET(pt.override_id,
(SELECT
GROUP_CONCAT(DISTINCT pt.part_id)
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
)))
WHEN '0' THEN NOT FIND_IN_SET(pt.part_id,
(SELECT
GROUP_CONCAT(DISTINCT pt.override_id)
FROM job j
INNER JOIN part_type pt ON j.part_id = pt.part_id
WHERE j.job_id = 1
AND pt.override_id IS NOT NULL))
END
GROUP BY j.job_id, pt.part_title
ORDER BY pt.part_title;
我只是不知道 CASE WHEN 也可以应用于 WHERE/AND 条件...非常方便!
关于MySQL 使用 CASE WHEN ELSE 根据另一列和子查询中的值过滤产品 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36839952/
我经常在 ATS 中看到使用 case、case+ 或 case- 形成的 case 表达式。有什么区别? 最佳答案 如果表达式不详尽,使用 case 会发出警告,case+ 会产生错误,而 case
我有一个导入时全部大写的表,我想将其转换为正确的大小写。你们用什么脚本来完成这个? 最佳答案 这个函数: “正确大小写”由空格分隔的所有“大写”单词 保留“小写单词” 即使对于非英语字母也能正常工作
#include int main() { switch(2) { case 1: if(1)
我已经四处寻找了一段时间,如果我使用的术语不当,请原谅我... 代码的目标是在输入为 0 时更新 Aout1 和 Aout0,输出对应于 7 段显示,但出现以下错误: “错误 (10170):Four
我正在尝试按照 PostgreSQL 手册中的说明进行操作。 PostgreSQL: Documentation: 9.1: Control Structures 我的 PostgreSQL 服务器是
我有一个状态机,其中有几个非常相似的状态。我可以为每个状态编写它,如下例所示: module CHECK_FSM ( GO, DONE, CLK, RESETN ); input GO;
如何使用或创建案例? 就像是: string str; case (str) "abc" || "dfg": begin //some code end "yfg":
这个问题已经有答案了: Are double and single quotes interchangeable in JavaScript? (23 个回答) 已关闭 9 年前。 我正在学习Java
汽车 Make | Model | Year | Color Honda | Accord | 12 | Red Lexus | IS | 14 |
如何使用当前 case 语句的值跳转到 switch-case 条件下的另一个 case 语句? 是否可以使用 switch case 来实现这种事情,或者是否有其他实现方式? 有可能实现吗?如果没有
我理解下面的代码。 var day = 2; switch (day) { case 1: document.write("Monday"); break;
这是有效的。 object FilesToDFDS { case class Student(id: Int, name: String, dept:String) def main(
我对 VHDL 还是个新手。我需要在 CASE 语句中为多个信号赋值,如下所示: CASE input24 IS WHEN "00" THEN output0
我有这个 case 语句,它给出了一个错误“变量 constant1 未使用”。它似乎忽略了变量并返回了第一行,因此变量显然没有范围。如果我用数字 1 替换常量,那么它就可以工作。在 Elixir 中
在 MySQL 中,是否可以在 SELECT 子句中有两个 CASE 语句,其中第二个 CASE 语句依赖于第一个 CASE 语句? 例如,考虑以下查询: SELECT CASE WHEN `user
我正在尝试一个挑战,我需要获得一个随机数,并在没有重复的情况下打印数字内的数字总和:例如,123 将打印 6 ( 1 + 2 + 3 ),而 32111 将做同样的事情(因为我们没有在我们的总和中添加
当有人试图更新当前未存储在我的散列中的值时,我想立即返回 when 'add' 而无需重新启动整个 case声明,因为我已经知道他们想要添加并且不想再次提示他们。 有没有一种方法可以在不重新启动整个案
老 C 程序员可以在 Swift 方面得到一些帮助。 我不太了解 if-case 语法。例如: if case 20...30 = age { print ("in range.") } cas
老 C 程序员可以在 Swift 方面得到一些帮助。 我不太了解 if-case 语法。例如: if case 20...30 = age { print ("in range.") } cas
我有一个 ArrayList,其中包含以下字符串:[name, age, gender, salary] . 有没有办法可以将 ArrayList 中的值用作 case 表达式? 显而易见的答案是否定
我是一名优秀的程序员,十分优秀!