【问题标题】:Sqlserver - three tables and ban listSqlserver——三表和禁止列表
【发布时间】:2014-01-26 15:33:37
【问题描述】:

我有 3 个表:usersitemslockeditems

我想显示 items 中的所有内容,但如果用户想隐藏某个项目,那么我会将他的用户 ID 和项目 ID 添加到锁定列表中

[users]
userid
username

[items]
itemid
itemname

[lockeditems]
itemid
userid

sqlserver, 如何选择所有[items],但不按[itemid]和[userid]显示itemlocked列表中的项目?

谢谢,抱歉没有格式化

【问题讨论】:

  • 你怎么知道用户是谁?

标签: asp.net sql sql-server


【解决方案1】:

SQL Fiddle

MS SQL Server 2008 架构设置

CREATE TABLE users
    ([userid] int, [username] varchar(4))
;

INSERT INTO users
    ([userid], [username])
VALUES
    (1, 'John'),
    (2, 'Mary')
;

CREATE TABLE items
    ([itemid] int, [itemname] varchar(6))
;

INSERT INTO items
    ([itemid], [itemname])
VALUES
    (1, 'saw'),
    (2, 'hammer')
;

CREATE TABLE lockeditems
    ([itemid] int, [userid] int)
;

INSERT INTO lockeditems
    ([itemid], [userid])
VALUES
    (1, 1)
;

查询 1

select u.userid, i.*
from users u
cross join items i 
left outer join lockeditems l on u.userid = l.userid and i.itemid = l.itemid
where l.userid is null

Results

| USERID | ITEMID | ITEMNAME |
|--------|--------|----------|
|      1 |      2 |   hammer |
|      2 |      1 |      saw |
|      2 |      2 |   hammer |

【讨论】:

    【解决方案2】:

    假设你有一个变量中的用户,比如@TheUserId,那么这是not exists子句的一个很好的用法:

    select i.*
    from items i
    where not exists (select 1
                      from lockeditems li
                      where li.userid = @TheUserId and
                            li.itemid = i.itemid
                     );
    

    【讨论】:

      【解决方案3】:
      CREATE TABLE users (  
      userid int,
      username varchar(20))
      
      CREATE TABLE  items (
      itemid int,
      itemname varchar(20))
      
      CREATE TABLE lockeditems (
      itemid int,
      userid int)
      
      INSERT INTO users VALUES  (1,'Adam'),(2,'Johan'),(3,'Jennifer'),(4,'Rajanand'),(5,'Jason')
      INSERT INTO items VALUES  (10,'Keyboard'),(20,'Mouse'),(30,'CPU'),(40,'Hard drive'),(50,'RAM')
      INSERT INTO lockeditems VALUES (30,3),(50,5)
      
      SELECT * FROM users WHERE userid NOT IN (SELECT userid FROM lockeditems)
      SELECT * FROM items WHERE itemid NOT IN (SELECT itemid FROM lockeditems)
      

      【讨论】:

      • 就是这样!我的表格看起来如何,但选择方法没有得到我的项目结果
      【解决方案4】:

      应该这样做:

      SELECT * 
          FROM Users u 
          CROSS JOIN Items i
      WHERE NOT EXISTS
          (SELECT * 
           FROM lockeditems li
           WHERE li.userID = u.userid AND i.itemid = li.itemid);
      

      Except 也可以使用

      SELECT  u.UserId, i.ItemId 
          FROM Users u 
          CROSS JOIN Items i
      EXCEPT
          SELECT li.UserId, li.ItemID
           FROM lockeditems li;
      

      SqlFiddle here

      【讨论】:

      • 第一个选项有效,但将用户交换到项目,只需要分组以仅显示项目,稍后将发布我是如何做到的,谢谢!
      • 好的,根据 Gordon 的评论,目前尚不清楚主题“用户”是谁。我假设你想要所有用户。
      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2019-11-12
      • 2017-03-19
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多