MySQL: как выбрать предпочтительное значение из нескольких строк (и вернуться к значению по умолчанию)? - PullRequest
2 голосов
/ 01 июля 2011

У меня есть следующий запрос, который возвращает список идентификаторов групп, которые прикреплены к идентификаторам продуктов, указанным в предложении IN.

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' имеет group_id '-1' и '2'). Что я хочу сделать, так это игнорировать значение «-1», когда есть альтернатива, поэтому я получаю следующее:

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

Я пытался использовать оператор GROUP BY для product_id, но я просто получаю значения -1 в столбце group_id.

Пожалуйста, кто-нибудь может дать мне несколько советов о том, как я могу это сделать!

Ответы [ 4 ]

0 голосов
/ 01 июля 2011

попробуйте это,

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 голосов
/ 01 июля 2011
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 голосов
/ 01 июля 2011

Вы можете использовать этот 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 голосов
/ 01 июля 2011
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)

Попробуй это. Это вернет 2, если оба -1 и 2 доступны. т.е. я просто выбираю максимум доступных идентификаторов группы. Надеюсь, это то, что вам нужно здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...