从MySQL中的2个不同的表中创建一个别名列

时间:2018-10-24 05:00:30

标签: mysql sql if-statement select

我有一个数据库表,该表与2个不同的表相关,例如:

   === inventory ===
+------------+-----------+
|    code    |   total   |
+------------+-----------+
| el_pr_25   |     45    |
| el_pr_11   |     33    |
| mob_tp_x93 |     23    |
| mob_tp_t55 |     33    |
| el_pr_x73  |     25    |
| mob_tp_25  |     22    |
+------------+-----------+

= electricity =
+-----+-------+
|  id | name  |
+-----+-------+
|  25 | test1 |
|  11 | test2 |
| x73 | test3 |
+-----+-------+

  == mobile ==
+-----+----------+
|  id |   name   |
+-----+----------+
| x93 | test 66  |
| t55 | test 222 |
| 25  | test 323 |
+-----+----------+

我要选择的主表是库存表,库存表通过code列连接到另一个表,电表的前缀是el_pr_,后跟{{1 }}的电表和移动表的前缀为id是前缀,我想从电和移动表中选择带有名称列的库存表,例如结果如下:< / p>

mob_tp_

3 个答案:

答案 0 :(得分:6)

我们可以尝试以下联接查询:

SELECT
    i.code,
    i.total,
    COALESCE(e.name, m.name) AS name
FROM inventory i
LEFT JOIN electricity e
    ON i.code REGEXP CONCAT('el_.*_', e.id, '$')
LEFT JOIN mobile m
    ON i.code REGEXP CONCAT('mob_.*', m.id, '$');

enter image description here

Demo

上述查询使用COALESCE技巧为每个项目选择正确的名称,假设给定的项目仅与electricitymobile表匹配。

但是,您的数据库设计并不理想。最好只包含一个表,其中包含移动项和电气项(以及其他项)的元数据。另外,您的表应具有正确的联接列,不需要需要复杂的子字符串或正则表达式操作才能匹配。我建议以下内容:

inventory
+----+------------+-----------+
| id |    code    |   total   |
+----+------------+-----------+
| 1  | el_pr_25   |     45    |
| 2  | el_pr_11   |     33    |
| 3  | el_pr_x73  |     25    |
| 4  | mob_tp_x93 |     23    |
| 5  | mob_tp_t55 |     33    |
| 6  | mob_tp_25  |     22    |
+----+------------+-----------+

items
+--------------+----------+-------------+
| inventory_id | name     | type        |
+--------------+----------+-------------+
| 1            | test1    | electricity |
| 2            | test2    | electricity |
| 3            | test3    | electricity |
| 4            | test 66  | mobile      |
| 5            | test 222 | mobile      |
| 6            | test 323 | mobile      |
+--------------+----------+-------------+

答案 1 :(得分:1)

您可以将inner joinunion [all]一起使用:

select i.*, e.name from inventory i 
                   inner join electricity e on ( i.code = concat('el_pr_',e.id) ) union all
select i.*, m.name from inventory i 
                   inner join mobile m on ( i.code = concat('mob_tp_',m.id) );

Rextester Demo

答案 2 :(得分:1)

我建议将您的数据模型更改为单独的列,并同时使用它们来形成唯一的约束。

|code  |   total   |type
+------+-----------+
| 25   |     45    |el_pr_
| 11   |     33    |el_pr_
| x93  |     23    |mob_tp_
| t55  |     33    |mob_tp_
| x73  |     25    |el_pr_
| 25   |     22    |mob_tp_

并将名称来源组合到一个表中

|  id | name  |type
+-----+-------+
|  25 | test1 |el_pr_
|  11 | test2 |el_pr_
| x73 | test3 |el_pr_
| x93 | test 66  |mob_tp_
| t55 | test 222 |mob_tp_
| 25  | test 323 |mob_tp_

然后

select *
from inventory i
join tab_names n on i.type = n.type and i.code = n.id

这只是一个粗略的轮廓!