【问题标题】:exclude rows with a particular ID if a joined value exists如果存在连接值,则排除具有特定 ID 的行
【发布时间】:2021-09-17 10:29:59
【问题描述】:
pollId  | user_id
   53   |  8
   53   |  3
   53   |  2
   61   |  null
   61   |  null
   62   |  1

如果我正在搜索 8 的 user_id,我的目标是完全排除 pollId 为 53 的所有行。

如果我使用 and r.user_id != 8,我仍然会得到一个 pollId 为 53 的不需要的行。同样,如果我使用 and r.user_id = 8。我只是得到 userId 8 的行。

我想要回来的是:

pollId  | user_id
   61   |  null
   62   |  1

完整的查询

      select p.poll_id, 
      r.user_id,
       from
      poll p
      inner join poll_question q 
      left join org_poll op
      on p.poll_id = op.poll_id 
      left join poll_result r
      on q.question_id = r.question_id
      where p.poll_id in (53, 61, 62) 
      and (op.org_id = 7 or p.all_orgs = 1) 
      and p.poll_id = q.poll_id
      and r.user_id != 8
      group by q.question_id

【问题讨论】:

  • 排除所有 pollId 为 53 的行 - 但假设你不是指 WHERE pollId <> 53,你的意思是“我想排除所有 pollId 任何行pollId 组中的用户 ID 为 8"?
  • 您的意图不是 100% 清楚 - 如果相同的查询只返回 user_id 8 if 值 3 和 2 没有共享相同的 pollId
  • 给它上下文可能更容易。 UserId 表示用户是否参加了投票 (53)。我想从我的查询中删除用户 8 进行投票的所有行,在本例中为 53。但是我从其他参与投票的用户 2 和 3 那里获得了额外的行。
  • inner join poll_question q 缺少 ON 子句。您的 MySQL 是否在 ONLY_FULL_GROUP_BY 关闭的情况下运行?

标签: mysql sql left-join


【解决方案1】:

如果我做对了,您希望排除与 user_id 8 关联的带有 pollids 的行。然后您可以使用 NOT EXISTS 和相关子查询。

SELECT DISTINCT
       *
       FROM poll p1
       WHERE NOT EXISTS (SELECT *
                                FROM poll p2
                                WHERE p2.pollid = p1.pollid
                                      AND p2.user_id = 8);

【讨论】:

    【解决方案2】:

    您可以添加一个 NOT IN 以一种可读性强、合乎逻辑的方式来覆盖它:

    select p.poll_id, 
          r.user_id,
           from
          poll p
          inner join poll_question q 
          left join org_poll op
          on p.poll_id = op.poll_id 
          left join poll_result r
          on q.question_id = r.question_id
          where p.poll_id in (53, 61, 62)        
          and (op.org_id = 7 or p.all_orgs = 1) 
          and p.poll_id = q.poll_id
          and r.user_id != 8
    
    
    AND p.poll_id NOT IN (
      SELECT q.poll_id 
      FROM poll_question q 
        JOIN org_poll op on q.poll_id = op.poll_id 
        JOIN poll_result r on q.question_id = r.question_id 
      WHERE r.user_id = 8)
    
    
          group by q.question_id
    

    还有其他方法,例如在 SELECT 中执行 COUNT(CASE WHEN user_id = 8 THEN 1 END) OVER(PARTITION BY poll_id) 并将整个内容包装在另一个要求计数为 0 的选择中;需要 MySQL 8

    【讨论】:

      【解决方案3】:
      select * from table T1
      where
      pollId not in
      (
          select pollId from table T2 where T2.user_id=8
      )
      

      【讨论】:

        【解决方案4】:

        我不知道你的数据模型,但我认为这个查询可以帮助你。像其他回复一样,我使用NOT IN 来获取那些 poll_id 中没有 user_id = 8 的所有行。

        SELECT pq.poll_id, pr.user_id
        FROM poll p
        INNER JOIN poll_question pq ON p.poll_id = pq.poll_id
        LEFT JOIN org_poll op ON p.poll_id = op.poll_id 
        LEFT JOIN poll_result pr ON pq.question_id = pr.question_id
        
        WHERE p.poll_id in (53, 61, 62) 
              AND (op.org_id = 7 OR p.all_orgs = 1)  
              AND p.poll_id NOT IN (SELECT DISTINCT pq.poll_id
                                    FROM poll_result pr
                                    INNER JOIN poll_question pq ON pq.question_id = pr.question_id
                                    WHERE pr.user_id = 8);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-09
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-14
          • 1970-01-01
          • 2019-09-25
          相关资源
          最近更新 更多