gpt4 book ai didi

mysql - 用一个查询替换单词来查询两个表

转载 作者:行者123 更新时间:2023-11-29 12:58:26 24 4
gpt4 key购买 nike

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

最佳答案

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

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 ;

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

关于mysql - 用一个查询替换单词来查询两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com