mysql - 查询 MYSQL 中单列中所有值匹配的项目
问题描述
我正在尝试获取所有项目都匹配的表的结果,然后只显示它们在特定stockId 中都匹配的结果。
我尝试以 variantId IN (4,1,8) 为例,但它向我显示了所有结果,而不是它们都匹配 4 1 和 8:
SELECT * FROM `products_bind_variant_stock_combination`
WHERE `variantId` IN (4,1,8)
我希望它返回变体 ID 匹配 4、1 和 8 的 3 个结果。或者我只想显示 ID 匹配所有这些的股票 ID。
我的结构在
products_bind_variant_stock_combination
|subId |int(10)|No |
|productsId |int(10)|Yes|NULL
|stockId |int(10)|Yes|NULL
|variantId |int(10)|No |
一个小样本是:
|1|69|1|4
|2|69|1|1
|3|69|1|8
|4|69|2|5
|5|69|2|1
|6|69|2|8
|7|69|3|6
|8|69|3|1
|9|69|3|8
搜索variantId作为匹配4,1,8时我想要的结果是:
|1|69|1|4
|2|69|1|1
|3|69|1|8
解决方案
在派生表中,我们可以获得所有stockId
只有值的1,4,8
variantId
值。为了找到这一点,我们可以GROUP BY
在子句stockId
中使用基于条件聚合的过滤。HAVING
stockId
现在,我们可以使用并获取该stockId
值的所有行来加入主表。
SELECT
t1.*
FROM products_bind_variant_stock_combination AS t1
JOIN (SELECT stockID
FROM products_bind_variant_stock_combination
GROUP BY stockID
HAVING SUM(variantId = 1) AND /* has variantId = 1 */
SUM(variantId = 4) AND /* has variantId = 4 */
SUM(variantId = 8) AND /* has variantId = 8 */
NOT SUM(variantId NOT IN (1,4,8)) /* no other variantId exists */
) AS t2 ON t2.stockId = t1.stockID
推荐阅读
- typescript - 你如何在 Jasmine 中测试一个 Typescript 函数?
- python - Pyplot 错误栏无法传递颜色数组
- database - 无法清楚地了解 oracle 中的 intersect
- python - 为什么 FreezeGun 不能使用 SQLAlchemy 默认值?
- sql-server - 为存储过程限制对 SQL Server 的授权 - 仅调用
- appium - 在 appium 医生中出现意外的令牌错误
- r - 使 R 函数返回一个锁定/不可变列表
- java - 遍历目录并获得 UnsupportedOperationException
- vba - 单击带有 java 脚本的 web 元素
- php - 在 tcpdf 中显示泰卢固语 unicode 字体是否需要任何配置?