【问题标题】:Mysql: Join only when column is emptyMysql:仅在列为空时加入
【发布时间】:2013-12-11 22:33:18
【问题描述】:

我正在尝试在 MySQL 中编写一个查询来获取图像列表。问题是,我只想在列不为空时加入另一个表。

图片:

|id|image                                                               |user_id|circle_id|is_deleted|
------------------------------------------------------------------------------------------------------
|1 |cdb10bee27262c597619fdef25bae0eb673f5d5d1b9b33697e40906ad851a25b.jpg|30     |1        |0         |
|2 |9e3213276225b900a3e19262a7761ec3fdf608b95441aa8fbc012f246514d394.jpg|30     |1        |0         |
|3 |a51e104c82de33a804ae0a09e719f3cd7aa205a0830eab4e1e4aa26fd8a6313d.jpg|30     |NULL     |0         |

circles_users:

|id|circle_id|user_id|
----------------------
|1 |1        |31     |

用户:

|id|username|
-------------
|30|elk     |
|31|moose   |

最初,我想出了这个,但经过检查,我意识到它不起作用。

SELECT images.*
FROM images
    LEFT JOIN circles_users ON circles_users.circle_id = images.circle_id
WHERE (circles_users.user_id = '31' OR images.circle_id IS NULL)
    AND images.user_id = '30'
    AND images.is_deleted = '0'
LIMIT 16

我似乎无法正确理解,所以我决定编写一些 pseudo sql 来说明我希望实现的目标

SELECT images.*
    FROM images

        CASE
            WHEN images.circle_id IS NOT NULL 
            THEN LEFT JOIN circles_users ON circles_users.circle_id = images.circle_id AND circles_users.user_id = '32'
        END CASE

    WHERE images.user_id = '30'
    AND images.is_deleted = '0'
    LIMIT 16

希望你明白我的意思。感谢您的帮助。

基本上,如果另一个用户在发布者共享的圈子中或者如果 circle_id 为空,我想获取用户(发布者)发布的所有图像

【问题讨论】:

  • 我不明白这个问题
  • 如果您不希望结果中出现 NULL,请尝试将 LEFT JOIN 更改为 INNER JOIN。
  • 我认为一些示例数据和预期输出会有所帮助。
  • @GarethD 希望现在有意义
  • 实际上,我正在检查 31 岁的用户圈子。我太笨了我的原始查询按预期工作。我工作了很长时间,我开始测试错误的数据。非常感谢您的努力和时间。我非常感谢。

标签: mysql sql join conditional


【解决方案1】:

如果我理解您的问题,您应该使用INNER JOIN

【讨论】:

  • 这个。只需将LEFT 更改为INNER,您将不会得到任何空连接
  • 我猜我的问题还不够好。基本上,如果 circle_id 为空,我仍然想返回图像。如果不是,那么我想加入 circles_users
  • 我刚刚遇到了一个左外连接,我怀疑这对我有用。
  • 但这不起作用。它只返回具有圆圈 id 的行。
  • 实际上,我的第一个查询完成了我想要它做的事情。我在错误的数据上测试它。感谢您的努力!
【解决方案2】:

然后将您的查询更改为类似

SELECT im.*
FROM images im
    LEFT JOIN circles_users cu ON cu.circle_id = im.circle_id AND cu.user_id = '31'
WHERE im.user_id = '30'
    AND im.is_deleted = '0'
LIMIT 16

【讨论】:

  • 实际上,我的第一个查询完成了我想要它做的事情。我在错误的数据上测试它。感谢您的努力!
【解决方案3】:

我的测试数据有缺陷,我对我的 sql 知识的信任很糟糕。原始查询是正确的并且按预期工作。

选择图片。* 来自图像 左加入 circles_users ON circles_users.circle_id = images.circle_id WHERE(circles_users.user_id = '31' OR images.circle_id 为 NULL) AND images.user_id = '30' AND images.is_deleted = '0' 限制 16

解释 运行查询时,它会获取 user_id = 30 的所有图像。如果 circle_id 不为空,它会获取相应的 circles_users 行,否则什么也不获取,因为它是左连接 Where 语句然后检查 circles_users.user_id (如果存在)= 31 否则它检查 images.circle_id 是否为空,有效地实现了我的目标。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2016-04-21
    相关资源
    最近更新 更多