2008-10-23 11 views
1

D'accord, donc j'ai une question qui ressemble à ceci:conditionnelle MySQL déclaration

SELECT 
    `orders`.*, 
    GROUP_CONCAT(
     CONCAT(
      `menu_items`.`name`, 
      ' ($', 
      FORMAT(`menu_items`.`price`,2), 
      ')' 
     ) SEPARATOR '<br>' 
    ) as `items`, 
    SUM(`menu_items`.`price`) as `additional`, 
    `children`.`first_name`, 
    `children`.`last_name`, 
    `organizations`.`base_price` 
FROM 
    `orders`, `order_items`, `menu_items`, `children`, `organizations` 
WHERE 
    `order_items`.`menu_item_id` = `menu_items`.`id` AND 
    `order_items`.`order_id` = `orders`.`id` AND 
    `orders`.`added_by` = {$user_id} AND 
    `orders`.`date` > '{$cutoff}' AND 
    `children`.`id` = `orders`.`child_id` AND 
    `organizations`.`id` = `children`.`organization_id` 
GROUP BY 
    `orders`.`id` 

Je sais que c'est une monstruosité et que certaines personnes vont mourir avant d'ne pas utiliser jointures explicites. En ignorant cela, cependant, ce que je souhaite faire est d'utiliser seulement le CONCAT à l'intérieur du GROUP_CONCAT si le menu_items.price est supérieur à 0, sinon retourner seulement. J'ai eu, cependant, aucun succès en essayant de jeter un IF là. J'ai lu le manuel, mais toutes les méthodes que j'ai essayées ne fonctionnent pas et je suis presque sûr qu'il me manque quelque chose sur l'ensemble des déclarations conditionnelles.

+0

oooh, le formatage des chaînes à l'intérieur de SQL me met en colère! Surtout le
, pas de danger de MVC ici! :) Avec cela sur ma poitrine, vous pouvez toujours envelopper la chaîne CONCATed avec un REMPLACEMENT (X, '
($ 0.00)', '') si vous ne pouvez pas comprendre autre chose. – joelhardi

+0

Hahaha. Eh bien parfois tu dois faire ce que tu dois faire. Et ça fait l'affaire. :) –

Répondre

5

Avez-vous essayé d'utiliser quelque chose comme ça?

CASE WHEN 'menu_items'.'price' = 0 THEN 'menu.items'.'name' ELSE CONCAT (etc) END 

Remplacement de l'instruction CONCAT.

+0

Cela l'a fait. Merci. –

1

Quelque chose comme cela devrait fonctionner (mais je n'ai pas testé, désolé):

GROUP_CONCAT(
    CONCAT(
    `menu_items`.`name`, 
    IF(`menu_items`.`price` > 0,       -- <condition> 
     CONCAT(' ($', FORMAT(`menu_items`.`price`,2), ')'), -- <true-expr> 
     ''             -- <false-expr> 
    ) 
) 
    SEPARATOR '<br>' 
) as `items`, 

La fonction IF() est très simple:

IF(<condition>, <true-expr>, <false-expr>) 

La fonction a trois arguments: le premier est <condition>. Si la condition est vraie, la fonction renvoie le résultat <true-expr>. Sinon, la fonction renvoie le résultat de <false-expr>.

Les choses se compliquent lorsque vous utilisez des expressions multi-lignes très longues qui contiennent des parenthèses et des virgules, etc. Vous devez juste le faire avec soin. Je suggère de commencer avec des expressions plus simples, puis de construire.