我有以下情况。我有一张桌子,上面有文章的所有信息。我想将同一列与其自身进行比较。因为我有多种类型的文章。单一产品和主产品。我唯一需要区别的方法是SKU。例如。

ID |   SKU
1   | 11111
2   | 11112
3   | 11113
4   | 11113-5
5   | 11113-8
6   | 11114
7   | 11115
8   | 11115-1-W
9   | 11115-2
10  | 11116


我只想列出或/并仅计算完全唯一的sku。跟随这个例子,唯一且没有变量的sku是(ID = 1、2、6和10),我将要创建一个查询,如果11113再次出现在该列上,则不进行查询。因此,总共我将是4个唯一的sku,而不是“ 6(总共)”。请告诉我。如果可能的话。

最佳答案

您可以通过对唯一行进行分组和计数来做到这一点。

首先,我们需要处理您的表并添加一个新列MasterSKU。这将是SKU列的前五个字符。一旦有了MasterSKU,就可以GROUP BY了。这会将具有相同MasterSKU的所有行捆绑在一起。分组后,便可以访问COUNT()之类的聚合函数。我们将使用该函数计算每个MasterSKU的行数。然后,我们将过滤出COUNT()大于1的所有行。这将使您仅剩下唯一的行。

取得该唯一列表,然后将其LEFT JOIN返回到原始表中以获取ID。

SELECT ID, A.MasterSKU
FROM (
    SELECT
        MasterSKU = SUBSTRING(SKU,1,5),
        MasterSKUCount = COUNT(*)
    FROM MyTable
    GROUP BY SUBSTRING(SKU,1,5)
    HAVING COUNT(*) = 1
) AS A
LEFT JOIN (
    SELECT
        ID,
        MasterSKU = SUBSTRING(SKU,1,5)
    FROM MyTable
) AS B
ON A.MasterSKU = B.MasterSKU


mysql - SQL验证具有相同列的列-LMLPHP

现在,我从您的示例中注意到了一件事。原始的SKU列实际上看起来像是三列合为一列。我们将多个值与连字符连接在一起。

11115-1-W

可能是有原因的,但是最有可能违反first normal form,这将使数据库难以查询。这就是为什么需要如此复杂的查询的部分原因。如果SKU列确实代表多个内容,那么我们可能要考虑将其分为MasterSKU,Version和Color或每个连字符代表的内容。

关于mysql - SQL验证具有相同列的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44055009/

10-10 00:41