2011-11-16 6 views
1

Je ne sais pas si c'est quelque chose que vous pouvez faire dans une seule instruction select sans sélection d'imbrication.Mysql Groupe BY avec if instruction

Je regroupe mes résultats et je veux savoir SI un champ dans l'ensemble du groupement contient une condition, affichez oui. Avec cela, il suffit de prendre la première ligne du groupe et vérifier l'état au lieu de toutes les lignes du groupe

if(field = 'condition','yes','no') as field_found 
+0

Pouvez-vous publier la requête avec laquelle vous travaillez? –

+0

Je l'ai trouvé: if (GROUP_CONCAT (field) COMME '% condition%', 'yes', 'no') – zbestzeus

+0

Je suis content que vous l'ayez compris. S'il vous plaît poster votre solution comme une réponse et marquer comme accepté. Cela supprimera votre question de la liste sans réponse. Merci! –

Répondre

1

exemple table: id, le score

SELECT t1.id, (
    SELECT IF("10" IN (
    SELECT score FROM table t2 WHERE t1.id = t2.id 
),'yes','no')) 
FROM table t1 
GROUP BY t1.id 

ce que ça marche?

+0

Cela devrait fonctionner mais j'essaye de ne pas imbriquer des sélections car la requête pour trouver la condition a déjà 4 jointures intérieures ... ainsi chaque sélection imbriquée aurait 4 jointures intérieures et je J'ai 6 conditions que je vérifie ce qui serait 6 conditions avec 4 jointures internes chacune et BLAH! – zbestzeus

0
if(GROUP_CONCAT(field) LIKE '%condition%','yes','no') 

SELECT first_name,last_name, CONCAT(physical_address," ",physical_address2," ",city, " ",zip) as address, MONTHNAME(install_date) as billing_month, IFNULL(status.quantity,0) as total_measures_instalclient2d,IFNULL(client1_measures,"") as client1_measures,IFNULL(client2_measures,"") as client2_measures,IFNULL(client1_quantity,0) as client1_quantity,IFNULL(client2_quantity,0) as client2_quantity,if(GROUP_CONCAT(measure_list.measure_type) LIKE '%Outreach/ Assessment%','yes','no') as outreach_invoiced,GROUP_CONCAT(IF(client='Client1',CONCAT(percent*100,"%-",measure_list.measure_type),NULL)) as client1_percent,GROUP_CONCAT(IF(client='Client2',CONCAT(percent*100,"%-",measure_list.measure_type),NULL)) as client2_percent,work_order.notes FROM customers 
INNER JOIN measure on measure.customer_id = customers.customer_id 
INNER JOIN measure_list on measure_list.measure_list_id = measure.measure_list_id 
INNER JOIN work_order on work_order.work_order_id = measure.work_order_id 
INNER JOIN billing on billing.workmanship = work_order.workmanship AND billing.measure_type = measure_list.measure_type 
LEFT JOIN (
SELECT customers.customer_id,SUM(quantity) as quantity,GROUP_CONCAT(IF(client='Client1',measure_description,NULL)) as client1_measures,GROUP_CONCAT(IF(client='client2',measure_description,NULL)) as client2_measures,SUM(IF(client='client1',quantity,0)) as client1_quantity,SUM(IF(client='client2',quantity,0)) as client2_quantity FROM customers 
INNER JOIN measure on measure.customer_id = customers.customer_id 
INNER JOIN measure_list on measure_list.measure_list_id = measure.measure_list_id 
INNER JOIN work_order on work_order.work_order_id = measure.work_order_id 
INNER JOIN billing on billing.workmanship = work_order.workmanship AND billing.measure_type = measure_list.measure_type 
WHERE measure_list.measure_type NOT IN ('measure1','measure2') 
GROUP BY customers.customer_id 
) as status on status.customer_id = customers.customer_id 
WHERE measure_list.measure_type IN ('measure1','measure2') 
GROUP BY customers.customer_id 
0

Puisque vous faites déjà un groupe par, vous devriez être en mesure d'ajouter un MAX() en tant que colonne ayant la condition que vous attendez et juste ajouter que le groupe ... tels que

select 
     MAX(if(field LIKE '%condition%','1', '2')) as ExtraOrderBy, 
     First_Name, 
     Last_Name, 
     ... rest of query ... 
    group by 
     customers.Customer_ID 
    order by 
     1 

Dans ce cas, l'ordre par est la colonne ordinale dans la liste SQL au lieu de retaper explicitement la condition MAX (IF()) ... Donc, si la condition est vraie, marquez-la avec "1", sinon "2" fera flotter tous ceux qui se qualifient en haut de la liste ... Ensuite, vous pourriez sous-classer par d'autres choses comme le nom, prénom, ou d'autres champs que vous avez interrogés.