用替换单词的一个查询查询两个表

尼古拉兹

我在mySql中有两个表,例如:

表1:城市

id    name     transport
1   new-york     1,3,4
2   dallas       3,4
3   la           1,2,4
4   california   3,4

表2:运输

id     name
1   bus
2   trolleybus
3   train
4   metro

我可以通过一个查询收到类似示例的结果吗?

结果:

id    name         transport
1   new-york     bus,train,metro
2   dallas       train,metro
3   la           bus,trolleybus,metro
4   california   train,metro
阿比克·查克拉博蒂(Abhik Chakraborty)

您应该更改数据库结构并对其进行规范化。切勿将数据存储为逗号分隔,因为这是存储数据的一种不好方法。但是,在修复数据库设计之前,以下查询应该可以完成您的工作。

select 
id,
name,
group_concat(transport)
from
(
  select
  c.id,
  c.name,
  t.transport as transport
  from city c
  join transport t on find_in_set(t.id,c.transport)

)x

group by id ;

演示

如果您需要订购运输价值,则可以使用

group_concat(transport ORDER BY transport)

为什么逗号分隔是不好的做法?您可以阅读以下内容,为什么要忽略它?在数据库列中存储分隔列表真的那么糟糕吗?

为了规范化数据库,您将需要创建另一个表,如下所示:

city_transport (cid int , tid) ;
cid = city id 
tid = transport id

对于每个城市,此表中都有多个条目。所以桌子应该像

create table city (id int , name varchar(100));
insert into city values
(1,'new-york'),(2,'dallas'),(3,'la'),(4,'california');

create table transport (id int ,transport varchar(100));
insert into transport values
(1,'bus'),(2,'trolleybus'),(3,'train'),(4,'metro');

create table city_transport (cid int ,tid int);

insert into city_transport values
(1,1),(1,3),(1,4),(2,3),(2,4),(3,1),(3,2),(3,4),(4,3),(4,4);

和获得相同结果的查询是

select
c.id,
c.name,
group_concat(t.transport order by t.transport) as transport
from city_transport ct
join city c on c.id = ct.cid
join transport t on t.id = ct.tid 
group by c.id ;

当您有大量数据时,从本质上讲,您将需要索引,然后在索引列上使用join,其性能将比使用带逗号分隔列表的find_in_set更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以编写一个用两个表进行“查找和替换”的SQL查询?

查询查找一个表中的重复值

两个线程查询一个表

PHP:在一个查询中的两个表

使用 PHP 用一个锚标签替换两个/三个单词

使用子查询查看单个表中两个表的不同列

如何在PHP代码中将两个表中的两个查询合并为一个查询?

构造一个SQL查询,该查询包含一个表中的两个记录的结果

用一个查询更新表

在一个表中但在两列中合并两个查询结果

在一个SQL查询中合并(合并)来自两个表的两列

在一个 SQL 查询中合并两个表并使用表名作为列名

SQL查询两个通过一个表的条件获取多个表数据

MySQL 查询根据来自两个不同表的值选择一个表。

在一个SQL查询中合并两个表,并使日期值唯一

MySQL一个结果来自同一表中的两个查询

用一个替换两个连续的CR

Laravel,使用查询查找那些ID在另一个表中的ID

用两个键查询使用swift解析一个对象

SQL Server 查询从同一个表中提取两个不同的行

我想用一个查询连接两个表

我正在尝试在一个查询中从两个不同的表中选择数据

在一个查询中从两个表中删除而不加入

MySQL的加入查询:两个主要的和一个链接表

为具有不同列的两个表创建一个选择查询

SQL查询使用同一个表比较两个WHERE子句

如何使用一个SQL查询从两个表中获得结果?

将两个SQL查询合并到一个表中

SQL在一个查询中对两个表求和