我有一个数据库表,该表与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_
答案 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, '$');
上述查询使用COALESCE
技巧为每个项目选择正确的名称,假设给定的项目仅与electricity
或mobile
表匹配。
但是,您的数据库设计并不理想。最好只包含一个表,其中包含移动项和电气项(以及其他项)的元数据。另外,您的表应具有正确的联接列,不需要需要复杂的子字符串或正则表达式操作才能匹配。我建议以下内容:
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 join
与union [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) );
答案 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
这只是一个粗略的轮廓!