2014-03-03 50 views
-1

我有一個包含以下內容的MySQL數據庫:查詢返回與組列值值或空

Products

id | name    | indexname |units 
-------------------------------------------- 
1 |Mydełko Fa   |FA_INDEX  |szt. 
2 |Ręcznik elegancki |RECZNIK_ELEG |szt. 
3 |Płyn do czyszczenia|CZYS_PLYN |l 

Prices

id | user_id | product_id | price 
----------------------------------- 
2 |NULL  |1   |21.32 
3 |3  |1   |20 
4 |NULL  |2   |43.21 
5 |NULL  |3   |12.12 

因此,大家可以看到有2產品的價格爲1.我想準備一個查詢,將返回

id | name    | indexname |units |price 
--------------------------------------------------- 
1 |Mydełko Fa   |FA_INDEX  |szt. |20 
2 |Ręcznik elegancki |RECZNIK_ELEG |szt. |43.21 
3 |Płyn do czyszczenia|CZYS_PLYN |l  |12.12 

所以我想要的是獲取user_id爲3的所有行,或者如果這樣的行不存在,那麼user_id爲null的那一行。

我試圖

SELECT * 
FROM `products` p1 
JOIN `prices` p2 ON p1.id = p2.product_id 
WHERE `user_id` = 3 OR `user_id` is null 

但是和其他一些沒有成功......你能幫忙嗎?

+0

這對我沒有太大意義。您如何知道,如果價格表中的產品價格不止一個,那麼它的正確價格將是與user_id = 3相對應的價格? –

+0

很簡單。對於所有用戶,價格與user_id = null是默認值。 ID爲3的用戶有特別折扣。 – karex

+0

然後我認爲你的設計是錯誤的。我會分開存儲折扣。 –

回答

2

一個簡單的辦法是同時獲得一次,當然你如果沒有用戶的價格存在該用戶得到一個空值:

SELECT p1.*, p2.price AS null_price, p3.price AS user_price 
FROM `products` p1 
JOIN `prices` p2 ON p1.id = p2.product_id AND `p2.user_id` IS NULL 
LEFT JOIN `prices` p3 ON p1.id = p3.product_id AND `p3.user_id` = 3 

然後使用您正在使用的任何編程語言來確定該字段是否爲空,以及使用哪個價格。

+3

你可以使用「ifnull(p3.price,p2.price)作爲user_price」來獲得它在一個列中 – noz

+0

你的確可以,好主意 – BenOfTheNorth

0

我想你需要的是這樣的:

SELECT * FROM products p1 
LEFT JOIN prices p2 ON p1.id = p2.product_id 
WHERE user_id IS NOT NULL OR p2.product_id IN (
    SELECT product_id FROM prices GROUP BY product_id HAVING COUNT(*) = 1) 
+0

一點也不。在價格表中添加一行: 6 | 4 | 2 | 12.21 將使您的查詢失敗... – karex

+0

我剛剛編輯。 –

0

試試這個:http://sqlfiddle.com/#!2/bfd50/1/0

SELECT * 
FROM products p 
JOIN prices pr ON pr.product_id = p.id 
WHERE pr.user_id = 3 OR pr.user_id IS NULL; 

沒有給你收到的錯誤,這是一個有點難以提供一個具體的答案。