2016-02-20 55 views
1

我有2种型号:CASE与EXISTS SQLite中查询将返回错误的结果

  • 产品 - 产品及其价格
  • 信息一览 - 产品可以有0 ... n个不同的优惠

表结构:

Table [shop_product] 
    Fields: 10 
     [id]: integer NOT NULL 
     [name]: varchar(300) NOT NULL 
     [slug]: varchar(150) NOT NULL 
     [description]: text NOT NULL 
     [photo]: varchar(100) NOT NULL 
     [price]: decimal NOT NULL 
     [category_id]: integer NOT NULL 
     [upload_date]: datetime NOT NULL 
     [is_enabled]: bool NOT NULL 
     [info_template_id]: integer 

Table [shop_productoffer] 
    Fields: 6 
     [id]: integer NOT NULL 
     [price]: decimal NOT NULL 
     [description]: text NOT NULL 
     [offer_attribute_id]: integer NOT NULL 
     [product_id]: integer NOT NULL 
     [default_offer]: bool NOT NULL 
    Foreign Keys: 
     [] ([product_id]) REFERENCES [shop_product]([id]) 

我想建立一个查询返回的产品和售前列表通过以下逻辑发送“default_price”字段: 如果一个产品有报价(S) - >显示最低的相关报价 否则从产品

这里显示的价格领域是什么,我得到了(SQLITE3查询):

SELECT 
product.price, 
CASE offer.price 
    WHEN EXISTS(SELECT * FROM shop_productoffer 
       WHERE shop_productoffer.product_id = product.id) 
    THEN (SELECT MIN(price) FROM shop_productoffer 
     WHERE shop_productoffer.product_id = product.id AND 
     shop_productoffer.default_offer = 1) 
    ELSE product.price 
END AS 'default_price' 
FROM shop_product as product 
LEFT JOIN shop_productoffer AS offer ON product.id = offer.product_id 

因为它看起来像,在Exists条件永不满足 - 查询总是返回default_price”值product.price。有些产品链接到优惠,其中一些不是,但结果总是相同的。

我做错了什么? 这是一个非常简单的查询,但我不能让它工作

+0

请你分享你的表格结构,一些样本数据,以及你试图得到的结果? – Mureinik

回答

1

更简单的方法可能是有一个聚集查询产生的最低报价,并left joinproduct表:

SELECT p.name, COALESCE(o.default_price, p.price) AS default_price 
FROM  shop_product p 
LEFT JOIN (SELECT product_id, MIN(price) AS default_price 
      FROM  shop_prodcutoffer 
      WHERE default_offer = 1 
      GROUP BY product_id) o ON p.id = o.product_id 
+0

你的方法工作正常,我想知道为什么我的不是。由于WHEN条件似乎从未得到满足 - 我试图将几个微小的WHEN(“TRUE”)条件放在一起,但结果总是来自“ELSE”块。 – Ofir

+1

@Ofir您的方法应该可以正常工作,但是您使用的语法不正确 - 当...有'case price'时 - 意味着您会尝试将'when'子句的值与行的'price'值进行比较 - 这可能永远不是“真”,但有一些十进制值。我想你打算在这里使用'case/* note no price! */when exists(select ...)then(select ...)else product.price end' – Mureinik

+0

现在全部已经清除。谢谢! – Ofir