【问题标题】:SQL SELECT Q - Retrieving RecordsSQL SELECT Q - 检索记录
【发布时间】:2014-04-10 05:41:29
【问题描述】:

我有一个表,其中包含由 projectid 列和 user_assignment 列表示的项目分配,其中包含用户的唯一用户 ID。如果用户在用户分配表中有与项目 ID 相关联的记录,则该用户被分配到项目。我想检索未分配给特定用户的所有项目而不会获得重复记录,因为有很多用户分配给项目。

虽然这些示例将只检索每个项目的一条记录,但它会返回用户“abc123”已分配和未分配的项目。我需要检索用户未分配到的项目 ID。

SELECT DISTINCT `propid` 
FROM `user_assignments` 
WHERE `userid` <> 'abc123' 
ORDER BY `propid` ASC

SELECT DISTINCT `propid` 
FROM `user_assignments` 
WHERE (`userid` <> 'abc123') 
ORDER BY `propid` ASC

我确信有一个非常简单的解决方案,但我没有看到它。

【问题讨论】:

  • 我假设它是 MySQL,你能在你的问题中澄清一下吗?它因不同的 SQL 服务器而异,我想确保我回答的是正确的问题。
  • 你能给我们一些示例数据吗?在我的脑海中,我不明白为什么您的查询不起作用。

标签: mysql sql


【解决方案1】:

以下查询可能会为您解决问题。

SELECT DISTINCT `propid` 
FROM `user_assignments` ua1
WHERE NOT EXISTS
(SELECT 1
FROM `user_assignments` ua2
WHERE ua1.propid = ua2.propid
AND   ua1.`userid` = 'abc123')
ORDER BY `propid`;

【讨论】:

    【解决方案2】:

    我认为您需要的是以下查询。

    SELECT DISTINCT `propid` 
    FROM `user_assignments` 
    WHERE `propid` NOT IN (SELECT `propid` 
                         FROM `user_assignments` 
                         WHERE `userid` = 'abc123')
    ORDER BY `propid`
    

    查询获取与特定用户关联的所有项目,然后获取他未关联的项目。

    编辑:您也可以尝试以下方法

    SELECT DISTINCT o.`propid` 
    FROM `user_assignments` as o
    WHERE NOT EXISTS (SELECT 1 FROM `user_assignments` as i
                      WHERE `userid` = 'abc123'
                         AND i.`propid` = o.`propid`)
    

    或者您可以使用 JOIN 来实现此目的

    SELECT DISTINCT o.`propid` 
    FROM `user_assignments` as o
        LEFT JOIN `user_assignments` as i 
            ON i.`propid` = o.`propid` AND i.`userid` = 'abc123'
    WHERE i.`propid` IS NULL
    

    【讨论】:

    • 我早些时候在 phpMyAdmin 中尝试过,它从不返回记录,它只是挂断了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2020-09-24
    相关资源
    最近更新 更多