新手需要查询帮助

时间:2012-01-11 07:27:49

标签: sql

我创建了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)
        )
    )

2 个答案:

答案 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)

这些表将像这样连接:

enter image description here

我已从您的设计中删除了前缀tbl(不是必需的),并假设用户只有一个首选区域和国家/地区。如果没有,您将使用关联类型表来存储每个用户的许多首选值。