0

我有两张桌子。Table_1 具有来自 table_2 的三个外键。我需要从 table_2 中选择所有行,其中 id 等于 table_1 中特定行的 val_1、val_2 和 val_3 的值。例如:

SELECT val_1, val_2, val_3 from table_1 WHERE id = 1;

然后使用第一个查询运行的结果

SELECT name FROM table_2 WHERE id IN (101, 102, 103);

有没有办法在一个查询中做到这一点?

表格1

ID 姓名 val_1 val_2 val_3
1 项目1 101 102 103
2 项目2 104 105 106

表_2

ID 姓名
101 子项目1
102 子项目2
103 子项目3
104 子项目4
105 子项目5
106 子项目6
4

2 回答 2

2

一种方法是连接val_1,val_2val_3在子查询中使用FIND_IN_SET()

SELECT name 
FROM table_2 
WHERE FIND_IN_SET(
        id, 
        (SELECT CONCAT_WS(',', val_1, val_2, val_3) FROM table_1 WHERE id = 1)
      );

或者,加入表格:

SELECT t2.name 
FROM table_2 t2 INNER JOIN table_1 t1
ON t2.id IN (t1.val_1, t1.val_2, t1.val_3)
WHERE t1.id = 1;

请参阅演示

于 2021-08-05T20:05:28.423 回答
0

这是一个相当复杂的 JOIN 操作。

SELECT t1.name, 
       t1.val_1, v1.name AS name1,
       t1.val_2, v2.name AS name2,
       t1.val_3, v3.name AS name3
  FROM table_1 t1
  LEFT JOIN table_2 v1 ON t1.val_1 = v1.id
  LEFT JOIN table_2 v2 ON t1.val_2 = v2.id
  LEFT JOIN table_2 v3 ON t1.val_3 = v3.id

并添加到@forpas演示...

但是想一想,如果您的 table_1 具有这种标准化布局,每行一个项目而不是三个项目,您的生活会变得多么轻松。

id  name    val 
1   item1   101 
2   item1   102
3   item1   103
4   item2   104 
5   item2   105
6   item2   106

那么您的查询将是

SELECT t1.name, t1.val, t2.name AS subname
  FROM table_1 t1
  LEFT JOIN table_2 t2 ON t1.val = t2.id
 WHERE t2.id IN (101, 102, 103) 
 ORDER BY t1.name, t2.name

在这里拉小提琴

于 2021-08-05T20:08:54.517 回答