Mysql 基于共享的外部ID选择相同的项目

Mysql 基于共享的外部ID选择相同的项目,mysql,Mysql,数据库包含产品集合;每个收集到的产品在添加到收集时都有一个价格记录,还有一些其他值 // `collections_products` id collection_id group product_id option_id price 1 1 0 56 0 3.1920 2 1 0 56 54 1.2000 3 1 0 56

数据库包含产品集合;每个收集到的产品在添加到收集时都有一个价格记录,还有一些其他值

// `collections_products`

id collection_id group product_id option_id price
1  1             0     56         0         3.1920
2  1             0     56         54        1.2000
3  1             0     56         55        2.4000
4  1             0     56         56        3.6000
5  1             0     56         57        4.8000
6  1             0     56         58        6.0000
7  1             0     57         0         3.1920
8  1             0     57         54        1.2000

11  10           0     56         0         3.1920
12  10           0     56         54        1.2000
13  10           0     56         55        2.4000
14  10           0     56         56        3.6000
15  10           0     56         57        4.8000
16  10           0     56         58        6.0000
17  10           0     57         0         3.1920
18  10           0     57         54        1.2000

21  100          0     56         0         9.9999
22  100          0     56         54        9.9999
23  100          0     56         55        9.9999
24  100          0     56         56        9.9999
25  100          0     56         57        9.9999
26  100          0     56         58        9.9999
27  100          0     57         0         9.9999
28  100          0     57         54        9.9999


31  1000         0     56         0         3.1920
32  1000         0     56         54        1.2000
33  1000         0     56         55        2.4000
34  1000         0     56         56        3.6000

36  1000         0     56         58        6.0000
37  1000         0     57         0         3.1920
38  1000         0     57         54        1.2000

有一些收藏id,我需要找到其他相同的、重复的、内容相同的收藏,即相同价格的相同产品、组和选项;订单对给定的订单不重要

在上述示例中:

集合id为10集合B的行集合是集合id为1集合a的行集合的副本;对于A中的每一行,B中的另一行具有相同的组产品\u id选项\u id价格,并且A和B具有相同的行数 集合id为100的行集合不是任何其他行的副本,因为所有价格都不同 集合_id1000的行集合不是任何其他行的重复,因为行的计数不同。与集合_id1相比,缺少行id 35 提出:

有一个select查询,根据它们所具有的公共ID和值查找其他集合,所有这些都在一个SQL语句中,但不确定MySQL是否可能做到这一点 计算每个集合的结果集组、产品id、选项id、每行价格的校验和,并将其存储为集合。校验和,每次集合内有移动时重新计算。搜索时,获取我拥有的集合的校验和,并根据该校验和进行选择。 研究了校验和思想。发现:

&:对单个行进行校验和,但不对结果集进行校验 :使用CRC32并具有预期的碰撞警告,这看起来是合理的 我不想重新发明轮子。奇怪的是,我找不到任何可重复使用的东西,除非我找错了方向

正确的方法是什么?请指教


更新我不想删除任何收藏,即使它们是重复的。我需要把它们结合起来。这是一个半虚构的例子,如果它没有100%的意义,很抱歉,像这样的东西应该可以工作:

SELECT `product_id`, `option_id`, `group`, `price`, COUNT(*) as count_occurrences 
FROM `collections_products`
GROUP BY `product_id`, `option_id`, `group`, `price`
HAVING count_occurrences > 1;
这将为您提供数据集中多次出现的所有产品标识、选项标识和价格组合。如果还需要相关行的ID,可以使用JOIN执行如下子查询:

SELECT cp.`id` FROM
(SELECT `product_id`, `option_id`, `group`, `price`, COUNT(*) as count_occurrences 
FROM `collections_products`
GROUP BY `product_id`, `option_id`, `group`, `price`
HAVING count_occurrences > 1) t1
LEFT JOIN `collections_products` cp
ON t1.`product_id` = cp.`product_id` 
AND t1.`option_id` = cp.`option_id` 
AND t1.`group` = cp.`group`
AND t1.`price` = cp.`price`;
SELECT DISTINCT t2.`collection_id` FROM
(SELECT `collection_id`,`product_id`, `option_id`, `group`, `price`
FROM `collections_products`
WHERE `collection_id`=?) t1
LEFT JOIN `collections_products` t2
ON t1.`product_id`=t2.`product_id`
AND t1.`option_id`=t2.`option_id`
AND t1.`group`=t2.`group`
AND t1.`price`=t2.`price`
AND t1.`collection_id`<>t2.`collection_id`;
UPD:

要获取包含与给定集合相同产品的集合ID,您需要以下内容:

SELECT cp.`id` FROM
(SELECT `product_id`, `option_id`, `group`, `price`, COUNT(*) as count_occurrences 
FROM `collections_products`
GROUP BY `product_id`, `option_id`, `group`, `price`
HAVING count_occurrences > 1) t1
LEFT JOIN `collections_products` cp
ON t1.`product_id` = cp.`product_id` 
AND t1.`option_id` = cp.`option_id` 
AND t1.`group` = cp.`group`
AND t1.`price` = cp.`price`;
SELECT DISTINCT t2.`collection_id` FROM
(SELECT `collection_id`,`product_id`, `option_id`, `group`, `price`
FROM `collections_products`
WHERE `collection_id`=?) t1
LEFT JOIN `collections_products` t2
ON t1.`product_id`=t2.`product_id`
AND t1.`option_id`=t2.`option_id`
AND t1.`group`=t2.`group`
AND t1.`price`=t2.`price`
AND t1.`collection_id`<>t2.`collection_id`;

你的意思是将一个完整的收藏与另一个收藏进行匹配,看它是否有完全相同的行?@aexl检查这个答案:你肯定在寻找具有相同组、产品id、选项id、价格和不同id的行,而你只想保留最近的最高id?@CaiusJard不,我不想删除重复的行,但实际上是把它们结合起来。编辑了这个问题,希望能让这一点更加明显。对不起,混淆了,COMBINE是什么意思?把他们的价格加起来?平均价格?谢谢你的意见。抱歉,我的问题中遗漏了一些内容:我需要根据给定的集合id搜索重复的集合。刚刚编辑过。@aexl我不确定我是否完全理解您的问题。我想到的第一件事是加上colledtion_id=?在这两种情况下,从集合\产品行返回查询后的子句。这将为您提供特定集合中具有相同产品、选项、组和价格的所有行。这就是您需要的吗?我需要找到与给定集合具有相同内容的其他集合。内容=相同的产品、选项、组和价格。