我创建了3个表。
tblRegion{RegionID as Integer, RegionName as varchar(100)},
tblCountries{CountryID as Integer, CountryName as varchar(100), RegionID as varchar(3)},
tblUsrs{UserID as Integer, UserName as varchar(100), PrefRegion as varchar(3), PrefCountries as varchar(100)}
现在每个表中的数据:
tblRegion
---------
RegionID RegionName:
1 Asia --
2 Africa --
3 Europe --
4 America
tblCountries
-------------
CountryID CountryName RegionID:
1 China 1 --
2 Malaysia 1 --
3 Singapore 1 --
4 Afganistan 3 --
5 UK 3 --
6 Spain 3 --
7 Libiya 2 --
8 Morocco 2 --
9 US 4 --
10 Canada 4 --
11 Mexico 4
tblUsrs
-------
UsrID UsrName PrefRegion PrefCountries:
1 Mike 2 -1 --
2 John -1 '1,5,9' --
3 Michael -1, '1' --
4 Tango -1 '8,9'
如果用户将区域传递为2,则从上面的数据中,userID 1和amp; 4将被显示。
我写过查询,但似乎有些不对劲。
Select *
from tblUsers
where (PrefRegion = '2') or ('2' in (
Select RegionID
from tblCountries, tblUsers
where convert(varchar,tblCountries.CountryID) in (tblUsers.PrefCountries)
)
)
答案 0 :(得分:0)
wherclause的第二部分(在'或'之后)subselect没有任何意义,即使sub-subselect是正确的 - 找出它是否有2为区域id对tblUsers选择没有任何影响。
编辑:感谢Michal让它变得可读:)
也许你所需要的是你选择的第3行:
where (PrefRegion = '2') and (PrefRegion in (the rest of the subselect) )
答案 1 :(得分:0)
您需要做的是将users表连接到其他两个表,如下所示:
SELECT *
FROM regions
INNER JOIN users_temp ON regions.rid = users_temp.prefRegionID
INNER JOIN countries ON users_temp.prefCountryID = countries.cid
WHERE(users_temp.prefRegionID = 2) AND (users_temp.prefCountryID = 2)
这些表将像这样连接:
我已从您的设计中删除了前缀tbl(不是必需的),并假设用户只有一个首选区域和国家/地区。如果没有,您将使用关联类型表来存储每个用户的许多首选值。