【问题标题】:SQL Bind multiple fields condition as AND clauseSQL 将多个字段条件绑定为 AND 子句
【发布时间】:2020-07-31 07:25:50
【问题描述】:

有人可以帮我处理这个 SQL。

输出必须始终加入 day_ids 作为多个条件。

例如,如果我们选择 day_id IN (0,2,4),它必须只返回所有具有 day_ids (0,2,4) 的数据。它工作正常。

所以当我们输入 (0,2,4,5) 时,它一定不能返回任何数据。这就是问题所在。

由于 IN 子句跟在 OR 语句之后,它仍然给出相同的结果,而不是返回 NULL。

样本数据:https://drive.google.com/file/d/1rXjOPxFRmtDjdyD4bDvULP-m38G5GvIB/view

视频:https://drive.google.com/file/d/1WM42cmmMe1nCusqacJNS_MI2t9szgZGn/view?usp=sharing

任何想法将不胜感激。

https://i.stack.imgur.com/lWfdy.png https://i.stack.imgur.com/s0Ala.png

【问题讨论】:

  • 它们只有 3 行吗?
  • 它的动态。用户可以填写一周中的所有 7 天。像 (0,1,2,3,4,5,6) 作为 day_ids。它的全部或全部。如果给定的day_ids没有找到给定参数的完全匹配和长度,它必须显示null。
  • 能否提供示例数据
  • 你能解释一下你的用例吗?也许可以有更好的方法,因为如果您指定的任何值不存在于表中,则返回 null 并不是很常见的要求

标签: mysql join in-clause


【解决方案1】:
SELECT * FROM vw_transfer_sched WHERE day_id in (0,2,4,5)
GROUP BY week_num, day_id, teacher_id
HAVING COUNT(distinct day_id) = 4;

【讨论】:

  • 它返回 null 没关系。但是当我回到原始查询并添加 COUNT 时,它也会给出 null ,它应该会返回一个匹配项。仍然没有达到预期的输出。 SELECT * FROM vw_transfer_sched WHERE day_id IN (0,2,4) GROUP BY day_id HAVING COUNT(distinct day_id) = 3
  • 您可以考虑在另一列上使用GROUP BY
  • 我想到的是使用另一个表或视图中的 SELECT 和子查询。正如我以前经常使用的那样。但还是想不通。
  • 您想试试这个并给我们结果SELECT * FROM vw_transfer_sched WHERE day_idIN (0,2,4) GROUP BY teacher_id HAVING COUNT(distinct day_id) = 3 吗?
  • 嗨@Aymen。它不起作用。我之前已经测试过该查询。顺便说一句,我附上了样本数据和视频。它返回了一些匹配但不准确的(0,2,4)。返回 0 和 2 但没有 4 的数据很少。
【解决方案2】:

SELECT * FROM vw_transfer_sched CASE WHEN day_id IN (0,2,4) THEN day_id ELSE Null END; 如果没有包含 0,2,4 的行,那应该给你 Null

【讨论】:

  • 没有。因为如果是这样的话,使用 IN 运算符将很容易完成这项工作。它实际上与使用 OR 相同。 IN 的执行类似于快捷方法。我更关心的是拥有相当于 IN 运算符。但不是作为 OR 运算符工作,而是作为 AND 工作。反向方法。
  • 我知道它与 IN (0,2,4) 相同,也许您需要改进您的问题,因为从我读到的内容中您想要 day_id = 0 2 4 的行,除非你只想要最后 3 行的答案应该工作,你可以用 IN (...) 替换 OR
  • 对答案进行了编辑,但您很可能只需要检查最后几行,您可以尝试在 date 中添加其他条件 >= current_timestamp() 可能会解决它
【解决方案3】:

无需将所需的必须退出 day_ids 发送到查询,您可以借助不同的查询找出所有这些 day_ids 是否存在并在外部进行比较,如果它们都存在,那么您可以运行您附加的查询。

您可以将以下查询的结果与您想要的必须存在的 day_ids 进行比较。

选择 group_concat(不同的 day_id) 来自teacher_availability_list 其中 day_id 在 (0,2,4,5)

使用您附加的表格,它将返回 0,2,4。 您可以在查询之外或在存储过程中执行此操作。

IF(上述查询的结果)=所需的必须有day_ids

然后 -> 运行查询

否则 返回空

【讨论】:

  • 我想到的是使用子查询作为从另一个表或视图获取的结果。在主查询中使用它。就像我经常做的那样。我会试试你的想法。
【解决方案4】:

试试

 select t.*  
 from 
 ( SELECT * 
   FROM teacher_availability_list 
   GROUP BY week_num,  teacher_id, day_id
   order by week_num, teacher_id ) as t    
group by week_num,  teacher_id 
having group_concat(t.day_id)='0,1,2'

【讨论】:

  • 我试试看。
  • 嗨BUcorp,它只返回day_id = 0的数据。它应该根据给定的参数显示所有具有day_ids的教师。就像如果我包含 (0,2),只会显示 day_ids 0 和 2 的所有教师。day_id 5 和 6 不存在数据。所以如果我添加 (0,2,5),它必须返回 null。因为只有 0 和 2 存在。
  • 您是否也将 count(*)= 更改为拥有?
  • 当然可以。它必须具有相同的长度。所以如果我们说 (0,2,4),count 必须是 3。如果我们有 (0,1,2,3,4),count 必须是 5。
  • 请检查解决方法。我使用了不同的方法。为了准确识别组,我将其视为字符串
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多