2017-08-17 91 views
1

我觉得它如此微不足道,但我还是坚持了这一点:Mysql的与GROUP BY + IF +左+加入GROUP_CONCAT

SELECT u.id, u.name, 

IF(s.prod_id=0, 1,NULL) as amount, 
IF(s.prod_id=92, 2,NULL) as amount2, 
IF(s.prod_id=116, 3,NULL) as amount3, 
IF(s.prod_id=134, 4,NULL) as amount4 

FROM table_user u 

LEFT JOIN table_user_status s ON s.user_id = u.id 
where s.prod_id = 0 OR s.prod_id = 92 OR s.prod_id = 117 OR s.prod_id = 134 

-- GROUP BY u.id 
order by u.id ASC 

我得到的是这样的:

22 | Matt | 1|NULL|NULL|NULL 

22 | Matt | NULL|2|NULL|NULL 

集团后编号我得到22 MATT 1 NULL NULL NULL,然后下一个记录。

在结束我必须为数据用户GROUP_CONCAT像 22 | Matt | 1,2 |

谢谢!

+0

您在WHERE还需要在选择116和117。我猜一个人是错的? – AjahnCharles

回答

1

使用CASE表达对所有这些案件返回为一列,然后只是GROUP_CONCAT它:

SELECT 
    u.id, 
    u.name, 
    GROUP_CONCAT(amount ORDER BY amount) amounts 
FROM 
(
    SELECT 
     u.id, 
     u.name, 
     CASE s.prod_id 
      WHEN 0 THEN 1 
      WHEN 92 THEN 2 
      WHEN 116 THEN 3 
      WHEN 134 THEN 4 
     END AS amount 
    FROM table_user u 
    LEFT JOIN table_user_status s 
     ON s.user_id = u.id 
    WHERE s.prod_id IN (0, 92, 116, 134) 
) u 
GROUP BY 
    u.id, 
    u.name 
ORDER BY u.id 
+0

好的。我更新后的查询有一种气味,将所有内容都放到一个列中肯定是这里+1的途径。 –

+0

哇,你是大兄弟!我很感激,非常感谢你!我很伤心,我不能给你“上”。 :( – Stanlej

+0

别担心,我永远不会让你失望。 – AjahnCharles