两个表联合查询的问题?
我有两个表,表1如
id name
184 李三
190 王二
198 吴六
....
表2如:
id members
3 190,184,198,
....
表2的members字段取自表1的id字段,且中间用逗号分隔(最后也有个逗号)。现在我要查询表2,希望得到id 为3的组员名字且按members的顺序排列,即王二,李三,吴六这样的结果。
我是这样做的:
先查表2,得到id为3的members值
select members from 表2 where id=3
再以members为条件对表1用in 语句:(为省略直接写出SQL语句了)如
select * from 表1 where id in (190,184,198)
这样虽然能得到符合条件的名字,但是顺序不是按表2 members字段的顺序。
还有什么更好的办法?
------解决方案--------------------SELECT a.id, a.name
FROM test a CROSS JOIN
test1 b
WHERE (b.id = 1) AND (CHARINDEX(a.id, b.members) > 0)
ORDER BY a.id
------解决方案--------------------SQL本身似乎没有对字符串或者数组进行排序的函数。
因此,要实现这个功能,你可能得自己写一个排序函数。
并且用这个函数在in (190,184,198)之前对字符串进行排序。
------解决方案--------------------表结构不合理导致,很明显多一个表会爽很多。
在不变结构的情况下:
你前台处理好members数组,然后拼合SQL语句一条查一个用UNION合并到一个记录集。
------解决方案--------------------楼主,若你想要的是“排序后的名字”,像下面那样设计表的话就很好做了:
id name
184 李三
190 王二
198 吴六
....
表2如:
id sequence members
3 1 190
3 2 184
3 3 198
------解决方案--------------------楼主,原来的设计是不规范的,违反了基本的范式。
试想,为一个查询费这么大的劲,值得吗?多加一个表怕什么呢?
当发现有些查询用SQL很难实现时,就需要检查一下是不是设计有问题。