【问题标题】:SELECT unique Product information of Catalog in MySQLSELECT MySQL中Catalog的唯一产品信息
【发布时间】:2014-10-21 09:19:52
【问题描述】:

我有一张包含一些产品目录的表格。桌子上有一个主商店,上面写着所有产品的价格。例如,对于主商店,IDShop 是 9999,一种产品可以是红卡 = 10 美元,原始 O​​riginIDProduct=101。

IDShop=9999
Price=10
OriginIDProduct=101

其余的商店包含一些不同的信息,例如不同的描述或不同的价格等。

假设例如这个数据:

IDShop=1
Price=12
OriginIDProduct=101

都在同一张桌子上,记住...

我需要选择来自商店 9999 的产品,但如果存在商店 1 的产品,请不要返回商店 9999 的该产品的信息。

在这种情况下,对于这个产品,SELECT 返回记录

IDShop=1
Price=12
OriginIDProduct=101

有什么想法吗?

【问题讨论】:

    标签: mysql select replace


    【解决方案1】:

    这将显示每个产品,如果存在,则显示商店 1 的价格,否则将默认为商店 9999。

    SELECT IFNULL(t2.IDShop, t1.IDShop) AS IDShop,
           IFNULL(t2.Price, t1.Price) AS Price,
           IFNULL(t2.OriginIDProduct, t1.OriginIDProduct) AS OriginIDProduct
    FROM table AS t1
    LEFT JOIN table AS t2 ON t1.OriginIDProduct = t2.OriginIDProduct AND t2.IDShop = 1
    WHERE t1.IDShop = 9999
    

    http://sqlfiddle.com/#!2/ca86b6/1

    【讨论】:

    • 此解决方案有效,但可以存在与主店不对应的新产品。例如,客户向喜欢销售的主店添加不同的新产品。例如,对于链接的样本,一个新产品,如 VALUES(1, 33, 100001)。在此选择中返回此产品的任何想法
    • 为此你需要一个FULL OUTER JOIN,但 MySQL 不支持它。如果您搜索 SO,您会找到解决方法。对于任何称职的程序员来说,修改我的答案以包含它应该很简单。
    • 感谢 Barmar,我找到了使用 UNION ALL 和 OriginIDProduct=0 的解决方案。因为所有产品都是新客户不与主店对应。我公布答案。谢谢,奥斯卡。
    【解决方案2】:
    select 
        IDShop, Price, OriginIDProduct
    from 
        table
    where
        IDShop <> 9999 
        or
        (   
            IDShop = 9999 
            and not exists (select IDShop from table where IDShop <> 9999)
        )
    

    【讨论】:

    • 这个解决方案不能解决问题。这仅返回IDShop 9999 的产品。但需要返回IDShop=9999 的产品并替换IDShop=1 的相同产品的记录。示例 IDProduct=1(店铺9999的信息),IDProduct=2(存在于9999和1中。1的记录代替9999,IDProduct=3(99999的信息。记住9999为主
    • @OscarFernándezArcís 抱歉,尚未了解您的需求。无论如何,我的查询仅返回 IDShop 9999 的产品是不正确的。看看“OR”条件。
    • 抱歉,您的解决方案返回:IDSHOP PRICE ORIGINIDPRODUCT1 12 1011 50 103 使用 Barmar 的 SQL 示例 (sqlfiddle.com/#!2/ca86b6/1) 正确的返回是:IDSHOP PRICE ORIGINIDPRODUCT1 12 1019999 14 102@987654329 @如果客户添加了与主店无关的新产品需要退货:IDSHOP PRICE ORIGINIDPRODUCT1 12 1019999 14 1021 50 1031 33 0问候,奥斯卡。
    【解决方案3】:

    终于在 Barma 的帮助下找到了解决办法,是这样的:

    SELECT IFNULL(t2.IDShop, t1.IDShop) AS IDShop,
           IFNULL(t2.Price, t1.Price) AS Price,
           IFNULL(t2.OriginIDProduct, t1.OriginIDProduct) AS OriginIDProduct
    FROM table AS t1
    LEFT JOIN table AS t2 ON t1.OriginIDProduct = t2.OriginIDProduct AND t2.IDShop = 1
    WHERE t1.IDShop = 9999
    UNION ALL
    SELECT IDShop, Price, OriginIDProduct FROM table WHERE IDShop=1 AND OriginIDProduct=0
    

    谢谢大家。 问候,奥斯卡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-16
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多