查询返回值,将set列设置为value或null

时间:2014-03-03 22:36:54

标签: mysql database

我有一个包含以下内容的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

因此,您可以看到ID为1的产品有2个价格。我想准备一个将返回的查询

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

和其他一些人没有成功......你能帮帮忙吗?

3 个答案:

答案 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

然后使用您使用的任何编程语言来确定该字段是否为空,以及使用哪个价格。

答案 1 :(得分: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)

答案 2 :(得分: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;

如果没有给出您收到的错误,提供具体答案有点困难。