我正在尝试查询DNN并获取两个PropertyDefinitionID和两个PropertyDefinitionID的值。这是我现在使用的代码,但不会返回任何结果。
SELECT *
FROM vw_Users u
INNER JOIN UserRoles r ON u.UserID = r.UserID and r.RoleID = '4'
INNER JOIN UserProfile p ON u.UserID = p.UserID
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND
p.PropertyDefinitionID = '47') AND
(p.PropertyValue = 'True' AND
p.PropertyDefinitionID = '48')
ORDER BY p.PropertyValue
有一条记录,其中PropertyDefinitionID = 47,PropertyValue ='b510dab0-8bf6-e011-84a9-00505691002c'。并且还有一个PropertyDefinitionID = 48和PropertyValue ='True'的记录。
因此,如果我打破这个问题,我会得到第一个:
UserId PropertyDefinitionID PropertyValue
5 47 eb03dde0-8bf6-e011-84a9-00505691002c
这是第二个:
UserId PropertyDefinitionID PropertyValue
5 48 True
但我希望他们在一个查询中,或者至少将结果合并。这可能吗?如果是这样,你在世界上怎么做呢?
编辑:但是我只想返回结果,如果它具有PropertyDefinitionID = 47的值并且仅当PropertyDefinitionID = 48为真时才返回结果。我希望两个标准都能满足。
谢谢!
答案 0 :(得分:2)
使用
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND
p.PropertyDefinitionID = '47') OR /*<------------------- Changed*/
(p.PropertyValue = 'True' AND
p.PropertyDefinitionID = '48')
回应评论。要让用户满足这两个条件,您可以使用。
SELECT u.*
FROM vw_Users u
INNER JOIN UserRoles r
ON u.UserID = r.UserID
WHERE r.RoleID = '4'
AND u.UserId IN (SELECT UserID
FROM UserProfile
WHERE ( PropertyValue =
'b510dab0-8bf6-e011-84a9-00505691002c'
AND PropertyDefinitionID = '47' )
OR
( PropertyValue = 'True'
AND PropertyDefinitionID = '48' )
GROUP BY UserID
HAVING COUNT(DISTINCT PropertyDefinitionID) = 2)
应该清楚如何在任意数量的条件下扩展它。
答案 1 :(得分:2)
你正在使用AND来做所有事情。您应该使用OR来区分您的条件。就像在逻辑类中一样:AND是将OR用于联合。
SELECT *
FROM vw_Users u
INNER JOIN UserRoles r ON u.UserID = r.UserID and r.RoleID = '4'
INNER JOIN UserProfile p ON u.UserID = p.UserID
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND p.PropertyDefinitionID = '47') OR
(p.PropertyValue = 'True' AND p.PropertyDefinitionID = '48')
ORDER BY p.PropertyValue
答案 2 :(得分:1)
INNER加入UserProfile表两次(参见修改后的代码)。
一旦为PropertyDefinitionID ='47'条件
同样对于PropertyDefinitionID ='48'条件
我还会将SELECT *更改为仅选择要返回的 特定字段
SELECT
*
FROM vw_Users u
INNER JOIN UserRoles r
ON u.UserID = r.UserID
and r.RoleID = '4'
INNER JOIN UserProfile p1
ON u.UserID = p1.UserID
and p1.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c'
and p1.PropertyDefinitionID = '47'
INNER JOIN UserProfile p2
ON u.UserID = p2.UserID
and p2.PropertyValue = True
and p2.PropertyDefinitionID = '48'
答案 3 :(得分:0)
将其中一个AND
语句更改为OR
,如下所示:
SELECT *
FROM vw_Users u
INNER JOIN UserRoles r ON u.UserID = r.UserID and r.RoleID = '4'
INNER JOIN UserProfile p ON u.UserID = p.UserID
WHERE (p.PropertyValue = 'b510dab0-8bf6-e011-84a9-00505691002c' AND
p.PropertyDefinitionID = '47') OR --HERE'S YOUR PROBLEM
(p.PropertyValue = 'True' AND
p.PropertyDefinitionID = '48')
ORDER BY p.PropertyValue