使用一个查询查询两个表并替换单词

时间:2014-05-16 13:50:40

标签: mysql

我在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

2 个答案:

答案 0 :(得分:1)

您应该更改数据库结构并将其规范化。永远不要将数据存储为逗号分隔,因为它是一种存储数据的坏方法。但是,在修复数据库设计之前,以下查询应该执行您正在查看的内容。

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 ;

<强> DEMO

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

group_concat(transport ORDER BY transport)

为什么逗号分离是不好的做法? 您可以阅读以下内容,为什么应该忽略它 Is storing a delimited list in a database column really that bad?

要规范化数据库,您需要创建另一个表

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 ;

当您拥有大量数据时,基本上您将需要索引,然后在索引列上使用连接,性能将比使用逗号分隔列表的find_in_set更好

答案 1 :(得分:0)

您应该使用城市和交通工具之间的表格来正确。话虽这么说,你可以使用REPLACE()subqueries解决这个问题,但性能会很糟糕。