####表 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

####表 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

|
1
```
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 ``` 这是我想到的语句,但是报错了 |
|
hulalallaApr 1, 2021
2
FIND_IN_SET
|
|
eason1874Apr 1, 2021
3
LEFT JOIN c
ON FIND_IN_SET(c.cid, a.cid) |
|
c6h6benzeneApr 1, 2021 via iPhone
4
这表设计就…一言难尽。
IN 的运算对象是集合,你需要想办法把 a 表中的 cid 和 did 拆开,例如 SQL Server 的 STRING_SPLIT 。 |
|
urlkApr 1, 2021
5
建议分开查 ... , 联表查出来格式也不对
|
|
6
第一次见第一范式都不符合的……
|
|
x86Apr 1, 2021
7
这 MySQL 表跟受委屈了...
|
|
yungo8Apr 1, 2021
8
分开查没毛病, 如果是管理系统的列表展示, 循环多查几次而已。
这不会是面试题吧? |
|
customsshenApr 1, 2021 via Android
9
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 )
|
|
yungo8Apr 1, 2021
10
@customsshen 兄弟,你看错了,a.cid 是逗号分隔的多个 id
|
|
customsshenApr 1, 2021 via Android
11
@yeqizhang 哈哈,好家伙,直接放弃吧。
|
|
12
放一条 sql 查恰恰是效率最低的方案之一
|
|
shyrockApr 1, 2021
13
拒绝回答这种问题,建议赶紧把表 1 拆开。把设计这种表的人拉去挂电线杆。
|
|
pendulumApr 1, 2021
14
表 a 的设计真是。。
|
|
TomVistaApr 1, 2021
15
祭天吧
|
|
tcfenixApr 1, 2021
16
如果你想 cid 跟 did 用来做外键的话你就应该搞个 relation 表, 建立 aid cid 与 did 的多对多对多的关系
到时候用起来就很简单 而不是用逗号分隔.....你这设计的都能进教科书了..... |
|
KouShuiYuApr 1, 2021
17
postgresql 是支持的,可以吧 cid,did 转成数组关联查询,
|
|
vynkiccApr 2, 2021
18
解决开表 1 的人
|
|
AlkTTTApr 2, 2021
19
这 A 表降 san 值,快跑!
|
|
SjwNo1Apr 2, 2021 via iPhone
20
为啥要一条 sql
|