2013-07-29 34 views
0

我的SQL查詢出現問題。我試圖查詢數據庫從3個不同的表中獲取數據,其中應用了一個表條件。 在第二個條目中,它正確地顯示了結果,但是第一個條目沒有顯示應用條件的表的結果。SQL查詢(LEFT JOIN +條件)在第一次輸入時不顯示正確結果

這是我的查詢:

SELECT 
    `".PRODUCTS."`.*, 
    `".CATEGORIES."`.*, 
    `q_prices`.* 
FROM 
    `".PRODUCTS."` 
LEFT JOIN 
    `".CATEGORIES."` 
ON 
    `".PRODUCTS."`.`category_id` = `".CATEGORIES."`.`category_id` 
INNER JOIN(
    SELECT 
     `".PRICES."`.* 
     MAX(`".PRICES."`.`price_modified`) modified 
    FROM 
     `".PRICES."` 
    GROUP BY 
     `".PRICES."`.`product_id` 
    ) `q_prices` 
ON 
    `".PRODUCTS."`.`product_id` = `q_prices`.`product_id` 

這是它返回:

Array 
(
[0] => stdClass Object 
    (
     [product_id] => 1 
     [product_name] => Test product 
     [product_alias] => test-product 
     [category_id] => 1 
     [product_created] => 2013-07-29 11:36:51 
     [product_modified] => 2013-07-29 11:36:51 
     [category_name] => Test categorie 
     [category_alias] => test-categorie 
     [category_parent] => wonenplaza.nl 
     [category_created] => 2013-07-29 11:39:29 
     [category_modified] => 2013-07-29 11:39:29 
     [price_id] => 1 
     [price_amount] => 25.00 
     [price_tax] => 21 
     [price_created] => 2013-07-29 11:38:18 
     [price_modified] => 2013-07-29 11:38:18 
     [modified] => 2013-07-29 11:38:52 
    ) 

[1] => stdClass Object 
    (
     [product_id] => 2 
     [product_name] => Priva Blue ID 
     [product_alias] => test-product2 
     [category_id] => 1 
     [product_created] => 2013-07-29 12:18:54 
     [product_modified] => 2013-07-29 12:18:54 
     [category_name] => Test categorie 
     [category_alias] => test-categorie 
     [category_parent] => wonenplaza.nl 
     [category_created] => 2013-07-29 11:39:29 
     [category_modified] => 2013-07-29 11:39:29 
     [price_id] => 4 
     [price_amount] => 20.00 
     [price_tax] => 21 
     [price_created] => 2013-07-29 12:19:11 
     [price_modified] => 2013-07-29 12:19:11 
     [modified] => 2013-07-29 13:30:05 
    ) 
) 

我認爲這是與在LEFT JOIN查詢指定的限制,但我不確定。我不知道如何查詢數據庫來獲得這些結果。

在此先感謝(:。

+0

我可以問你最後一次加入時想達到什麼嗎?找到每件商品的最新價格? –

+0

是的,我想保留價格的歷史記錄,但在此查詢中,我試圖獲取該產品的最新價格。 – Yordi

+0

沒有DESC限制這樣的事情。 DESC與ORDER BY有關。 –

回答

0

你的子查詢找到所有價格的最新信息,不管產品是什麼,這不是你所需要的。修復它不是微不足道的,但你可以重寫你的嵌套查詢到LEFT JOIN,這會似乎簡化了事情; (對不起,你的桌子稍微改名以使SQLfiddle開心)

SELECT `.PRODUCTS.`.*, `.CATEGORIES.`.*, `q_prices`.* 
FROM `.PRODUCTS.` 
LEFT JOIN `.CATEGORIES.` 
    ON `.PRODUCTS.`.`category_id` = `.CATEGORIES.`.`category_id` 
LEFT JOIN `.PRICES.` `q_prices` 
    ON `q_prices`.`product_id` = `.PRODUCTS.`.`product_id` 
LEFT JOIN `.PRICES.` `dummy` 
    ON `dummy`.`product_id` = `.PRODUCTS.`.`product_id` 
AND `q_prices`.`price_modified` < `dummy`.`price_modified` 
WHERE `dummy`.`price_modified` IS NULL; 

A simple SQLfiddle to test with

0

這是如何開始使用最新的值相關聯的其他數據

select f1, f2, etc 
from sometables 
join (
select f1, max(datefield) maxdt 
from table1 
where whatever 
group by f1 
) temp on table1.datefield = maxdt 
and table1.f1 = temp.f1 
etc 

適用這一原則,以你的表,你是好去順便說一句,你想要一個內部連接,而不是左側連接到派生表。

+0

謝謝丹,我認爲這讓我有點進一步了!我更新了開幕帖子,以便與我現在的代碼中的內容相匹配。它顯示了兩個結果,但它顯示了相反的順序。我需要最新的價格,而不是最古老的。 我不知道我是否正確理解了您的解決方案,您可以請檢查一下嗎? – Yordi

+0

你只做了一部分。您使用產品ID加入派生表,但不是price_modified等於最大值。 –