【问题标题】:SQL conditional join challengeSQL 条件连接挑战
【发布时间】:2012-07-13 18:21:12
【问题描述】:

我在 mysql 数据库中有 2 个表存储和共享。我试图避免使用 IN 子句。详情请看下文

select id, user_id from stores where user_id =7;
+----+---------+
| id | user_id |
+----+---------+
| 36 |       7 |
| 37 |       7 |


select stores_id,share_id from shares where share_id=7;
+-----------+----------+
| stores_id | share_id |
+-----------+----------+
|        15 |        7 |
|        38 |        7 |

现在我运行这个

SELECT stores.id
FROM   stores
WHERE  user_id = 7
UNION
(SELECT stores.id
 FROM   stores
 WHERE  id IN (SELECT stores_id
               FROM   shares
               WHERE  share_id = 7)); 

要得到以下结果:

+----+
| id |
+----+
| 36 |
| 37 |
| 15 |
| 38 |
+----+

问题 如何重写查询以便不使用 IN 关键字?

【问题讨论】:

  • 是的……当我不知道的时候。 :)

标签: mysql sql join conditional


【解决方案1】:

您可以使用EXISTS

WHERE EXISTS
       ( SELECT 1
           FROM shares
          WHERE share_id = 7
            AND stores_id = stores.id
       )

JOIN:

JOIN shares
  ON shares.stores_id = stores.id
 AND shares.share_id = 7

(请注意,JOIN 可能会返回某些商店的多个副本,但因为 UNION 暗示 SELECT DISTINCT,这实际上不会影响您的最终结果集。)

【讨论】:

    【解决方案2】:

    这对你有帮助:

    select stores.id from stores where user_id = 7  
    UNION  
    select s1.id from stores s1 
           inner join shares s2 
           on s2.share_id = 7 
           and s1.id = s2.stores_id;
    

    【讨论】:

      【解决方案3】:

      如果您只需要 ID,这将很好......

      SELECT stores.id
      FROM   stores
      WHERE  user_id = 7
      
      UNION
      
      SELECT stores_id as id
      FROM   shares
      WHERE  share_id = 7
      

      但如果您需要来自 stores 表中其他列的一些数据,INNER JOIN 或 EXISTS 将是您的最佳选择。

      【讨论】:

      • 肿块。也许某些 store_id 不在 stores 表中...!
      • 是的,但它很可能是一个外键,没有它,参照完整性将会丢失并且记录会成为孤立的。如果是这种情况,则应清理表并添加检查约束。
      • 这个想法是获取stores表中的所有列。克里斯 - 如果我只需要商店 ID,您的解决方案将起作用。谢谢。
      【解决方案4】:

      左连接应该完成您正在寻找的内容:

      select distinct stores.id 
      from stores 
      left join shares on stores.id = shares.stores_id
      where stores.user_id = 7 
      or shares.share_id = 7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2017-04-27
        • 2022-01-13
        • 1970-01-01
        • 2017-06-23
        • 2022-11-10
        • 2018-06-04
        相关资源
        最近更新 更多