【问题标题】:id IN (list of other ids) depending on IFsid IN(其他 id 列表)取决于 IF
【发布时间】:2021-08-09 14:19:19
【问题描述】:

我有一个简单的加入方式:

SELECT field.table1, field.table2 
LEFT JOIN table2 ON table2.table1 = table1.id
FROM table1
WHERE table1.id = [changing id];

其中 table1.id 是自增索引,table2.table1 是从 table1 到 table2 的 1:n 键。

现在我需要做类似的事情:

SELECT field.table1, field.table2 
LEFT JOIN table2 ON 
[   IF table1.id = 1 THEN table2.table1 IN (10, 11, 12)
    IF table1.id = 2 THEN table2.table1 IN (13, 14)
    IF table1.id = 3 THEN table2.table1 IN (15)
    IF table1.id = 4 THEN table2.table1 IN (16, 17, 18)]
FROM table1
WHERE table1.id = [changing id];

这样做的正确语法是什么?

请记住,这只是一个示例。我需要这样做是有原因的(内涵 1 => 10,11,12, 2 => 13,14 等不是来自数据库/孔查询被动态输入另一个系统,我无法更改以及查询在哪里完成,所以我现在不知道 id)。

【问题讨论】:

  • and ((table1.id = 1 AND table2.table1 IN (10, 11, 12)) OR (table1.id = 2 AND table2.table1 IN (13, 14)) OR ...
  • 虽然完全有可能做到这一点,但我真的觉得这是其中一种情况,你的真正目标的一些背景将使找到一个好的解决方案变得容易得多。因为一般情况下你不应该这样跳来跳去,这会导致用户体验很差。

标签: mysql sql mariadb


【解决方案1】:

语法应该是一系列逻辑(AND\OR)子句:

SELECT field.table1, field.table2 
LEFT JOIN table2 ON 
   (table1.id = 1 AND table2.table1 IN (10, 11, 12) )
OR (table1.id = 2 AND table2.table1 IN (13, 14) )
OR (table1.id = 3 AND table2.table1 IN (15) ) 
FROM table1
WHERE table1.id = [changing id];

【讨论】:

    【解决方案2】:

    我要做的是创建一个映射表,就像这样(我们称之为table3):

    Table1ID Table2ID
    1 10
    1 11
    1 12
    2 13
    2 14
    3 15
    4 16
    4 17
    4 18

    然后为连接添加另一个级别:

    SELECT field.table1, field.table2 
    FROM table1
    LEFT JOIN table3 ON table3.Table1ID = table1.id
    LEFT JOIN table2 ON table2.id = table3.table2ID
    WHERE table1.id = [changing id];
    

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多