首页 > 解决方案 > 选择只有一个关联值不在预定义列表中的所有元素

问题描述

注意:我很难为这个问题选择一个标题。我不确定它是否准确地描述了我想要的东西,所以如果你能帮助改进标题而不是投反对票,我将不胜感激。:)


我有一个具有以下结构的表:

log:
+-----+-----+
| uid | uip | <- user id and user ip
+-----+-----+

我还有一个带有一些预定义用户 ID 的表:

predfined_users:
+-----+
| uid |
+-----+
|  1  |
-------
|  2  |
-------
|  3  |
-------

我想要达到的目标:

我的“算法”应该找到所有uip以下步骤的结果对他们来说是 1:

  1. loguip
  2. 计算有多少用户不在predfined_users表中。

例子:

假设这是与 IP 地址关联的用户列表1.0.0.0

+-----+
| uid |
+-----+
|  1  |
-------
|  3  |
-------
|  7  |

这些值中只有一个不在predfined_users(7) 中,因此1.0.0.0应返回。我也想选择所有uip满足这一点的,也就是说,只有一个uid与它们相关联的不在predfined_users. 此外,值得注意的是,如果 auip仅与 one 相关联uid,则查询不应返回它。

我已经尝试过的

这是我的一般想法,但我不确定要写什么而不是???或者即使我的方向是正确的:

SELECT [uip]
FROM log
WHERE (
    SELECT COUNT(*)
    FROM (
        SELECT DISTINCT [uid]
        FROM log WHERE [uip] = ???
    )a
    WHERE uid NOT IN (
        SELECT uid
        from predfined_users
    ) 
)=1

标签: sqlsql-servertsql

解决方案


像这样的东西:

select l.uip, count(distinct l.uid)
from log l left join
     predefined_users pu
     on l.uid = pu.uid
where pu.uid is null
group by l.uip;

推荐阅读