我试图获得一个所有项都匹配的表的结果,然后只显示它们在特定StockID中都匹配的结果。
我尝试在(4,1,8)中执行variantId作为示例,但它向我显示了所有结果,而不是所有结果都与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
搜索匹配4,1,8的variantId时,我想要的结果是:
|1|69|1|4
|2|69|1|1
|3|69|1|8
在派生表中,我们可以获得所有的stockid
值,该值只有1,4,8
variantid
值。为此,我们可以在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