如何用一条 SQL 语句同时查询这三张数据表?数据表如下

2021-04-01 16:31:08 +08:00
 frozenway

####表 a aid|name|cid|did|sex|xdate --|:--:|:--:|:--:|:--:|--: 1|john|1,3|1,2,3|未知|2021-01-02

####表 c cid|cname --|--: 1|小花 2|阿狸 3|大菊

####表 d did|dname --|--: 1|大黄 2|小黑 3|小灰

需要一次性查出表 a aid=1 的详细数据,表 a 的 cid 对应表 c 的 cid,表 a 的 did 对应表 d 的 did

1669 次点击
所在节点    问与答
20 条回复
frozenway
2021-04-01 16:36:21 +08:00
```
SELECT a.*, c.*, d.* FROM a LEFT JOIN c ON c.cid IN a.cid LEFT JOIN d ON d.did IN a.did WHERE a.aid=1
```
这是我想到的语句,但是报错了
hulalalla
2021-04-01 16:45:46 +08:00
FIND_IN_SET
eason1874
2021-04-01 16:51:42 +08:00
LEFT JOIN c
ON FIND_IN_SET(c.cid, a.cid)
c6h6benzene
2021-04-01 16:52:18 +08:00
这表设计就…一言难尽。

IN 的运算对象是集合,你需要想办法把 a 表中的 cid 和 did 拆开,例如 SQL Server 的 STRING_SPLIT 。
shenjinpeng
2021-04-01 16:55:48 +08:00
建议分开查 ... , 联表查出来格式也不对
lance6716
2021-04-01 16:58:18 +08:00
第一次见第一范式都不符合的……
x86
2021-04-01 16:59:33 +08:00
这 MySQL 表跟受委屈了...
yeqizhang
2021-04-01 16:59:43 +08:00
分开查没毛病, 如果是管理系统的列表展示, 循环多查几次而已。

这不会是面试题吧?
customsshen
2021-04-01 17:01:44 +08:00
select a.*,c.* from a left join c on a.cid= c.cid where a.aid=1 union ( select a.* , d.* from a left join d on a.cid= d.cid where a.aid=1 )
yeqizhang
2021-04-01 17:09:53 +08:00
@customsshen 兄弟,你看错了,a.cid 是逗号分隔的多个 id
customsshen
2021-04-01 17:20:30 +08:00
@yeqizhang 哈哈,好家伙,直接放弃吧。
dqzcwxb
2021-04-01 17:34:10 +08:00
放一条 sql 查恰恰是效率最低的方案之一
shyrock
2021-04-01 18:20:06 +08:00
拒绝回答这种问题,建议赶紧把表 1 拆开。把设计这种表的人拉去挂电线杆。
pendulum
2021-04-01 19:17:00 +08:00
表 a 的设计真是。。
TomVista
2021-04-01 19:42:14 +08:00
祭天吧
tcfenix
2021-04-01 19:49:02 +08:00
如果你想 cid 跟 did 用来做外键的话你就应该搞个 relation 表, 建立 aid cid 与 did 的多对多对多的关系

到时候用起来就很简单


而不是用逗号分隔.....你这设计的都能进教科书了.....
KouShuiYu
2021-04-01 22:25:08 +08:00
postgresql 是支持的,可以吧 cid,did 转成数组关联查询,
vynkicc
2021-04-02 11:03:42 +08:00
解决开表 1 的人
AlkTTT
2021-04-02 11:27:45 +08:00
这 A 表降 san 值,快跑!
SjwNo1
2021-04-02 19:53:56 +08:00
为啥要一条 sql

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX