FIND_IN_SET() 与 IN()

2024-05-01

我的数据库中有 2 个表。一种是针对订单的,一种是针对公司的。

订单具有以下结构:

OrderID     |     attachedCompanyIDs
------------------------------------
   1                     1,2,3
   2                     2,4

公司的结构如下:

CompanyID      |        name
--------------------------------------
    1                 Company 1
    2                 Another Company
    3                 StackOverflow
    4                 Nothing

要获取订单的公司名称,我可以进行如下查询:

SELECT name FROM orders,company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)

该查询工作正常,但以下查询则不然。

SELECT name FROM orders,company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)

为什么第一个查询有效但第二个查询无效?

第一个查询返回:

name
---------------
Company 1
Another Company
StackOverflow

第二个查询仅返回:

name
---------------
Company 1

这是为什么,为什么第一个查询返回所有公司,而第二个查询只返回第一个公司?


SELECT  name
FROM    orders,company
WHERE   orderID = 1
        AND companyID IN (attachedCompanyIDs)

attachedCompanyIDs是一个标量值,被转换为INT(类型companyID).

强制转换仅返回第一个非数字之前的数字(在您的情况下为逗号)。

Thus,

companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)

In PostgreSQL,您可以将字符串转换为数组(或者首先将其存储为数组):

SELECT  name
FROM    orders
JOIN    company
ON      companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE   orderID = 1

这甚至会使用索引companyID.

不幸的是,这不适用于MySQL因为后者不支持数组。

您可能会发现这篇文章很有趣(请参阅#2):

  • MySQL 中的 10 件事(不会按预期工作) http://explainextended.com/2010/11/03/10-things-in-mysql-that-wont-work-as-expected/

Update:

如果逗号分隔列表中的值的数量有一些合理的限制(例如,不超过5),所以你可以尝试使用这个查询:

SELECT  name
FROM    orders
CROSS JOIN
        (
        SELECT  1 AS pos
        UNION ALL
        SELECT  2 AS pos
        UNION ALL
        SELECT  3 AS pos
        UNION ALL
        SELECT  4 AS pos
        UNION ALL
        SELECT  5 AS pos
        ) q
JOIN    company
ON      companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FIND_IN_SET() 与 IN() 的相关文章

随机推荐

  • 使用 Mapstruct 将对象列表转换为长 ID 列表

    我在用MapStruct将实体转换为 DTO 我有一个实体 A 和实体 B 的列表 public class A List b bs 我想要 ADto 类中的 B id 列表 public class ADto List b
  • 如何禁用将包上传到 PyPi 除非将 --public 传递给上传命令

    我正在开发包并将包的开发 测试 等版本上传到本地 devpi 服务器 为了防止意外上传到PyPi 我采用了以下常见做法 setup classifiers Programming Language Python Programming La
  • 是否可以在选择器中进行修剪?

    我想计算表单中所有为空的输入 对于空 我的意思是它的值在修剪其值后为空 如果用户插入空格也为空 这个 jquery 对它们进行计数 但不包括修剪 text filter value length 有一些 jquery 可以用来在选择器中修剪
  • 如何继续使用适用于 AWS Cognito 的 AD FS SAML?

    我正在设置 AD FS 来生成 SAML 元数据以连接到 AWS Cognito 用户池 我已经生成了 xml 元数据并将其上传到用户池 我应该在 AD FS 站点上创建信任中继吗 是否还有其他步骤可以让我的 AD 用户可用于 Web 应用
  • 如何集成Django和Cygwin?

    我有一个安装了 cygwin python 和 django 的 Windows 盒子 现在我想运行 django admin 但是当我这样做时 我收到错误 django admin py c Python26 python exe can
  • 无法获得 S.M.A.R.T.外部驱动器的信息

    我正在尝试获取外部 USB 驱动器的 SMART 信息 我使用以下查询来获取驱动器的温度 但是该查询始终返回集合中的单个对象 即我的内部 HDD ManagementObjectSearcher searcher new Managemen
  • 使用 python 中 pandas 的 read_excel 函数将日期保留为字符串

    Python 2 7 10 尝试过 pandas 0 17 1 函数 read excel 尝试过 pyexcel 0 1 7 pyexcel xlsx 0 0 7 函数 get records 在Python中使用pandas时可以读取e
  • 基于范围的 for 带大括号初始化器而不是非常量值?

    我正在尝试迭代一些std lists 对它们中的每一个进行排序 这是天真的方法 include
  • Box2d 自定义多边形和精灵不匹配

    我正在使用物理编辑器在 Box2d 中创建多边形 它生成多边形并在非视网膜显示器中工作正常 但在视网膜显示器中不起作用 我已附上两个显示器的屏幕截图 现在 当谈到视网膜显示器时 未设置多边形在汽车上方 这是该图像 这是我在项目中使用的代码
  • 如何使用包含点/句点的 MVC5 基于属性的路由?

    我基本上有一个开箱即用的 MVC 5 2 应用程序 启用了基于属性的路由 调用routes MapMvcAttributeRoutes 从提供的RouteConfig RegisterRoutes RouteCollection route
  • 在应用程序中搜索对象的设计模式

    需要一些有关设计模式的帮助 我正在创建一个应用程序 该应用程序在存储在单独表中的数据库中的对象上具有不同类型 例如 我有 5 种对象 A B C D E 我在数据库中有 5 个不同的表来存储每个对象 现在 我想在我的应用程序中实现搜索功能
  • 如何使用 INSTEAD OF 触发器获取插入表中的新记录的标识

    我在表上使用 INSTEAD OF 插入触发器来设置该行上递增的版本号 并将该行复制到第二个历史记录 审核表 这些行插入到两个表中都没有问题 但是 我无法将第一个表中的新身份返回给用户 Schema CREATE TABLE Table1
  • “pow”的使用含糊不清

    大家好 我尝试过 当有人给出一秒钟时 我会得到十亿秒的实时数据 所以我就写了这样的代码 我必须将第二次乘以 10 9 但出现错误 pow 的使用含糊不清 func gigaSecond second Int gt Int var gigas
  • 在 Swift 中获取 UIPickerView 控件的选定值

    如何在 Swift 中获取 UIPickerView 控件的选定值 我尝试过这样的事情 labelTest text Spinner1 selectedRowInComponent 0 description 但这仅返回选定的索引 我需要这
  • 二维向量的迭代器

    如何为 2d 向量 向量的向量 创建迭代器 虽然你的问题是not非常清楚 我假设您的意思是 2D 向量表示向量的向量 vector lt vector
  • 哪种编写回调的方法更好?

    只要看看我现在写的东西 我就可以看到一个小得多 所以就代码高尔夫 http en wikipedia org wiki Code golf Option 2是更好的选择 但就哪个更干净而言 我更喜欢Option 1 我真的很喜欢社区对此的意
  • d3.select 不适用于特殊字符

    我正在使用 d3 js 处理简单的图表 假设下面的 div 是我计划放置 d3 的 svg 容器的地方 div 但是当我使用 d3 select my div chart 我无法选择特定的 div 但是通过使用 java 脚本选择器 它可以
  • 如何在 Flutter 中使用函数创建动态 TabBarView/ 渲染新 Tab?

    所以我学习flutter有一段时间了 就卡在这个了 抱歉 如果这是一个新手问题 我目前正在尝试构建类似卡片选项卡的东西 信息和小部件将存储在卡中 想象一下像 Tinder 这样的东西 他们有多个卡片堆 并且左右滑动即可导航 我计划创建它 但
  • 如何使用jquery $.post()方法提交表单值[重复]

    这个问题在这里已经有答案了 我有 1 个带有表单的主页和另一个用于处理表单值的页面 这是两个页面的源代码 表格页
  • FIND_IN_SET() 与 IN()

    我的数据库中有 2 个表 一种是针对订单的 一种是针对公司的 订单具有以下结构 OrderID attachedCompanyIDs 1 1 2 3 2 2 4 公司的结构如下 CompanyID name 1 Company 1 2 An