2011-07-01 34 views
2

我有以下查询,它返回附加到IN子句中指定的产品ID的组ID的列表。MySQL:如何从多行中选择首选值(并回退到默认值)?

SELECT t1.product_id, t2.group_id 
FROM table_1 t1 
LEFT JOIN table_2 t2 
ON t1.product_id = t2.product_id 
WHERE t1.product_id IN(1,2,3,4,5) 
AND t2.group_id = -1 
OR t2.group_id = 2 

这回是这样的:

+------------+----------+ 
| product_id | group_id | 
+------------+----------+ 
| 1   | -1  | 
| 1   | 2  | 
| 2   | -1  | 
| 3   | -1  | 
| 4   | -1  | 
| 5   | -1  | 
+------------+----------+ 

的GROUP_ID总是会有-1的默认值,但在某些情况下,可能有不止一个值(例如,PRODUCT_ID“ 1'具有'-1'和'2'的group_id)。我想要做的就是忽视了“-1”的值时,还存在另一种,所以我结束了这一点:

+------------+----------+ 
| product_id | group_id | 
+------------+----------+ 
| 1   | 2  | 
| 2   | -1  | 
| 3   | -1  | 
| 4   | -1  | 
| 5   | -1  | 
+------------+----------+ 

我用集团通过声明上的product_id,但我刚刚结束了group_id列中的-1值。

请有人可以给我一些关于我如何能够做到这一点的指针!

+0

是否有任何理由要加入自PRODUCT_ID两个表中存在? – niktrs

+2

如果一个产品与'group_id's,例如'2'和'3',除了'-1'有关,应该发生什么? –

+0

不错的问题。如果最大值是两个(-1,其他数字)查询代码可以非常简单 – niktrs

回答

0
SELECT t1.product_id, MAX(t2.group_id) 
FROM table_1 t1 , table_2 t2 
WHERE t1.product_id IN(1,2,3,4,5) 
AND t1.product_id = t2.product_id 
AND t2.group_id = -1 
OR t2.group_id = 2 
GROUP BY (t1.product_id) 

试试这个。如果-1和2都可用,这将返回2。即,我只选择可用组ID的最大值。希望这是你所需要的是什么

+0

答案将是3,根据OP,如果没有与产品相关的组,则组ID为-1,如果有任何关联,他希望“忽略-1并给出组ID”。所以,当至少有一个组与产品相关联时,这会给出一个组ID。 – Balanivash

0
SELECT t1.product_id, COALESCE(MAX(t2.group_id),-1) AS group_id -- if there is no group id default to -1 
FROM table_1 t1 
LEFT JOIN table_2 t2 
ON t1.product_id = t2.product_id 
WHERE t1.product_id IN(1,2,3,4,5) 
AND t2.group_id IN (-1, 2) 
GROUP BY t1.product_id 
0

你可以使用这个SQL:

SELECT t1.product_id, t2.group_id 
FROM table_1 t1 
LEFT JOIN (SELECT product_id, MAX(group_id) AS group_id 
      FROM table_2 
      WHERE group_id IN (-1,2) 
      GROUP BY product_id) t2 ON t1.product_id = t2.product_id 
WHERE t1.product_id IN (1,2,3,4,5) 
0

试试这个,

SELECT product_id, group_id= '-1' From products GROUP BY product_id HAVING COUNT(product_id) = 1 
UNION 
SELECT product_id, MAX(group_id) FROM products GROUP BY product_id HAVING COUNT(product_id) > 1 
+0

Hi @sudheshna,你确定这个SQL对这个问题有效吗? – doctore

+0

是的,它会工作,第一个查询将返回所有记录与单​​个组ID(-1),第二个将返回最大的group_id为那些有多个group_ids – sudheshna

+0

您好@sudheshna,你真的读了这个问题? @Tom与两个表一起工作,他需要结果不重复product_id的值。你的sql假设group_id的值等于-1且product_id = 1,他需要的恰恰相反。 sql中的两个表在哪里? – doctore