Php 如果产品有条形码且所有产品都没有条形码,则按产品条形码进行Sql查询

Php 如果产品有条形码且所有产品都没有条形码,则按产品条形码进行Sql查询,php,mysql,sql-server,Php,Mysql,Sql Server,我收集了一些产品,有些产品有条形码,有些没有条形码。所以,我想显示所有没有条形码的产品,如果任何产品有条形码,那么它们将按条形码分组,这样我只能显示一个 假设下表中有如下产品: ID Name Barcode 1 ABC 349377934434 2 DEF 349377934434 3 XYZ NULL 4 XXX NULL 根据上述给定数据,我的查询应该只给出

我收集了一些产品,有些产品有条形码,有些没有条形码。所以,我想显示所有没有条形码的产品,如果任何产品有条形码,那么它们将按条形码分组,这样我只能显示一个

假设下表中有如下产品:

ID    Name        Barcode  
 1    ABC         349377934434  
 2    DEF         349377934434  
 3    XYZ         NULL  
 4    XXX         NULL
根据上述给定数据,我的查询应该只给出3种产品,即1或2、3和4。
对于上述条件,sql查询将是什么?我想在单个查询中获取数据。我不想在代码中使用循环来查找上述条件下的产品


请帮我写这篇文章好吗?提前感谢

看到您将SQL Server包括在列表中,下面是一个将在列表中运行的示例:

DECLARE @table TABLE (id INT, name VARCHAR(20), barcode VARCHAR(20));
INSERT INTO @table SELECT 1, 'ABC', '349377934434';
INSERT INTO @table SELECT 2, 'DEF', '349377934434';
INSERT INTO @table SELECT 3, 'XYZ', NULL;
INSERT INTO @table SELECT 4, 'XXX', NULL;
WITH Summary AS (
    SELECT
        ISNULL(barcode, CONVERT(VARCHAR(50), NEWID())) AS barcode,
        MAX(name) AS name
    FROM
        @table
    GROUP BY
        ISNULL(barcode, CONVERT(VARCHAR(50), NEWID())))
SELECT
    CASE WHEN barcode LIKE '%-%' THEN NULL ELSE barcode END AS barcode,
    name
FROM
    Summary;
这是非常不言自明的,我按条形码分组,在有重复项的地方按名称取最上面的结果。如果条形码为空,我将用随机GUID替换它,然后在最后将其去掉

结果如下:

barcode         name
349377934434    DEF
NULL            XXX
NULL            XYZ
对于MySQL(我不知道如何在MySQL中使用临时表,所以我创建/删除简单表“temp”):


使用带有CTE的接头如何:

设置

CREATE TABLE #Products
( ID int,
  Name VARCHAR(5),
  BarCode VARCHAR(15) NULL
)

INSERT INTO #Products
VALUES (1, 'ABC', '349377934434'),
       (2, 'DEF', '349377934434'),  
       (3, 'XYZ', NULL),  
       (4, 'XXX', NULL)
查询:

;WITH CTE
As
(
    SELECT ID, Name, BarCode, ROW_NUMBER() OVER (Partition By BarCode ORDER BY ID) AS RN
    FROM #Products  
    WHERE BarCode is NOT Null
)
SELECT ID, Name, BarCode
FROM #Products
WHERE BarCode is Null
UNION
SELECT ID, Name, BarCode
FROM CTE
WHERE RN = 1

DROP TABLE #Products

谢谢你的回复。我们如何在Mysql中实现这一点?感谢您的回复。我们如何在Mysql中实现这一点?谢谢。这就是我要找的东西。
CREATE TABLE #Products
( ID int,
  Name VARCHAR(5),
  BarCode VARCHAR(15) NULL
)

INSERT INTO #Products
VALUES (1, 'ABC', '349377934434'),
       (2, 'DEF', '349377934434'),  
       (3, 'XYZ', NULL),  
       (4, 'XXX', NULL)
;WITH CTE
As
(
    SELECT ID, Name, BarCode, ROW_NUMBER() OVER (Partition By BarCode ORDER BY ID) AS RN
    FROM #Products  
    WHERE BarCode is NOT Null
)
SELECT ID, Name, BarCode
FROM #Products
WHERE BarCode is Null
UNION
SELECT ID, Name, BarCode
FROM CTE
WHERE RN = 1

DROP TABLE #Products