2017-08-17 1 views
1

Ich denke, es ist so trivial, aber ich mit diesem fest:Mysql mit einer Gruppe von + IF + LEFT JOIN + 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 

ich so etwas wie:

22 | Matt | 1|NULL|NULL|NULL 

22 | Matt | NULL|2|NULL|NULL 

Nach Gruppe von ID bekomme ich 22 MATT 1 NULL NULL NULL und dann next record.

Am Ende muss ich Benutzer Group_concat für Daten wie 22 | Matt | 1,2 |

Dank!

+0

Sie haben 116 in der SELECT und 117 in der WHERE. Ich denke, einer liegt falsch? – AjahnCharles

Antwort

1

einen CASE Ausdruck verwenden alle diese Fälle als eine einzige Spalte zurückzukehren dann GROUP_CONCAT es nur:

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

Schöner Fang. Meine aktualisierte Abfrage hatte einen Geruch, und alles in eine einzelne Spalte zu bekommen ist definitiv der Weg, um hier +1 zu gehen. –

+0

Wow, du bist ein großer Bruder! Ich schätze es, vielen Dank! Ich bin traurig, dass ich dich nicht "auf" geben kann. :( – Stanlej

+0

Mach dir keine Sorgen, ich werde dich nie im Stich lassen. – AjahnCharles