【问题标题】:How to reuse values from multiple columns in the select statement of mysql如何在mysql的select语句中复用多列的值
【发布时间】:2021-08-05 19:57:15
【问题描述】:

我有两张桌子。 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);

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

table_1

id name val_1 val_2 val_3
1 item1 101 102 103
2 item2 104 105 106

table_2

id name
101 sub_item1
102 sub_item2
103 sub_item3
104 sub_item4
105 sub_item5
106 sub_item6

【问题讨论】:

  • JOIN,它被称为。
  • 您希望您的结果是什么样的?

标签: mysql join denormalized


【解决方案1】:

一种方法是在子查询中连接val_1val_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;

请参阅demo

【讨论】:

    【解决方案2】:

    这是一个相当复杂的 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 demo...

    但是想想如果你的 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
    

    Fiddle here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 2015-01-30
      • 2020-07-04
      • 2015-09-17
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多