获取 join table id 匹配或者是 id 列表子集的记录
Get records where join table ids matches or is a subset of a list of ids
我有一个名为 variants 的 table,它连接到另一个名为 option_values[=52] 的 table =] 在多对多关系中通过 table 调用 option_values_variants.
我想提取所有 变体,它们在加入的 option_values table。这更容易用一个例子来证明:
Table数据:
变体
id | name
--------------
1 | Tennant
2 | Smith
3 | Eccleston
4 | Hurt
option_values
id | name
---------
80 | blue
81 | red
82 | green
83 | 64 gb
84 | 128 gb
85 | 256 gb
86 | short
87 | long
option_values_变体
variant_id | option_value_id
----------------------------
1 | 80
1 | 85
1 | 86
2 | 82
2 | 85
2 | 87
3 | 80
3 | 84
3 | 86
4 | 81
4 | 83
4 | 86
在这个例子中,我想获取所有具有选项值 "blue" 和 "short" 的变体,特别是(因此选项值 ID 为 80 和 86)。
预期结果 应该是变体 "Tennant" 和 "Eccleston",因为这些变体同时具有 "blue" 和 "short",尽管每个人都有一个不同的期权价值。 "Hurt"有"short",没有"blue",应该排除,"Smith"两个都没有。
在 Rails 上下文中或在普通 SQL 中,我似乎在形成此查询方面遇到了一些问题。我似乎无法弄清楚如何指定 "the join should be made only when the ids of the joining table match or are a subset of the target parameter list"。这是我目前的尝试:
@product.variants.joins(:option_values).where(option_values: {id: [80, 86]}).uniq
产生 SQL 查询:
SELECT DISTINCT `variants`.* FROM `variants`
INNER JOIN `option_values_variants` ON `option_values_variants`.`variant_id` = `variants`.`id`
INNER JOIN `option_values` ON `option_values`.`id` = `option_values_variants`.`option_value_id`
WHERE `variants`.`product_id` = 32 AND `option_values`.`id` IN (80, 86)
由于查询正在执行 WHERE ... IN ()
,因此它没有产生所需的结果。使用上面的示例,我会 return "Tennant"、"Eccleston" 和 "Hurt",但是 "Hurt" 不应该属于,因为它不包含选项值 "blue"(或选项值 id 80)。
如何 select 记录连接的 table 行匹配或者是给定 ID 列表的子集?
此外,这可能是上述大脑阻塞的结果,但不可否认,我可能没有很好地解释这一点。如果我没有任何意义,请告诉我
您可以使用 group by
并使用 having count(distinct option_values.id) = 2
指定结果具有两个选项值
SELECT
v.id,
v.name
FROM variants v
INNER JOIN option_values_variants ov
ON ov.variant_id = v.id
INNER JOIN option_values o
ON o.id = ov.option_value_id
WHERE v.product_id = 32
AND o.id IN (80, 86)
GROUP BY
v.id,
v.name
HAVING COUNT(DISTINCT o.id) = 2
我有一个名为 variants 的 table,它连接到另一个名为 option_values[=52] 的 table =] 在多对多关系中通过 table 调用 option_values_variants.
我想提取所有 变体,它们在加入的 option_values table。这更容易用一个例子来证明:
Table数据:
变体
id | name
--------------
1 | Tennant
2 | Smith
3 | Eccleston
4 | Hurt
option_values
id | name
---------
80 | blue
81 | red
82 | green
83 | 64 gb
84 | 128 gb
85 | 256 gb
86 | short
87 | long
option_values_变体
variant_id | option_value_id
----------------------------
1 | 80
1 | 85
1 | 86
2 | 82
2 | 85
2 | 87
3 | 80
3 | 84
3 | 86
4 | 81
4 | 83
4 | 86
在这个例子中,我想获取所有具有选项值 "blue" 和 "short" 的变体,特别是(因此选项值 ID 为 80 和 86)。
预期结果 应该是变体 "Tennant" 和 "Eccleston",因为这些变体同时具有 "blue" 和 "short",尽管每个人都有一个不同的期权价值。 "Hurt"有"short",没有"blue",应该排除,"Smith"两个都没有。
在 Rails 上下文中或在普通 SQL 中,我似乎在形成此查询方面遇到了一些问题。我似乎无法弄清楚如何指定 "the join should be made only when the ids of the joining table match or are a subset of the target parameter list"。这是我目前的尝试:
@product.variants.joins(:option_values).where(option_values: {id: [80, 86]}).uniq
产生 SQL 查询:
SELECT DISTINCT `variants`.* FROM `variants`
INNER JOIN `option_values_variants` ON `option_values_variants`.`variant_id` = `variants`.`id`
INNER JOIN `option_values` ON `option_values`.`id` = `option_values_variants`.`option_value_id`
WHERE `variants`.`product_id` = 32 AND `option_values`.`id` IN (80, 86)
由于查询正在执行 WHERE ... IN ()
,因此它没有产生所需的结果。使用上面的示例,我会 return "Tennant"、"Eccleston" 和 "Hurt",但是 "Hurt" 不应该属于,因为它不包含选项值 "blue"(或选项值 id 80)。
如何 select 记录连接的 table 行匹配或者是给定 ID 列表的子集?
此外,这可能是上述大脑阻塞的结果,但不可否认,我可能没有很好地解释这一点。如果我没有任何意义,请告诉我
您可以使用 group by
并使用 having count(distinct option_values.id) = 2
SELECT
v.id,
v.name
FROM variants v
INNER JOIN option_values_variants ov
ON ov.variant_id = v.id
INNER JOIN option_values o
ON o.id = ov.option_value_id
WHERE v.product_id = 32
AND o.id IN (80, 86)
GROUP BY
v.id,
v.name
HAVING COUNT(DISTINCT o.id) = 2