MySQL условный оператор - PullRequest
1 голос
/ 24 октября 2008

Хорошо, у меня есть запрос, который выглядит следующим образом:

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`

Я знаю, что это чудовище, и некоторые люди умрут, прежде чем не использовать явные объединения. Однако, игнорируя это, я хочу использовать CONCAT внутри GROUP_CONCAT, только если menu_items.price больше 0, в противном случае возвращается только menu_items.name. Однако я безуспешно пытался бросить туда IF. Я прочитал руководство, но все способы, которые я пробовал, не работают, и я почти уверен, что что-то упускаю из-за условных утверждений.

Ответы [ 2 ]

5 голосов
/ 24 октября 2008

Вы пробовали использовать что-то подобное?

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

Замена оператора CONCAT, конечно.

1 голос
/ 24 октября 2008

Что-то вроде этого должно работать (но я не проверял это, извините):

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`,

Функция IF() действительно проста:

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

Функция имеет три аргумента: первый - <condition>. Если условие оценивается как true, функция возвращает результат <true-expr>. В противном случае функция возвращает результат <false-expr>.

Ситуация становится сложнее, когда вы используете действительно длинные многострочные выражения, содержащие круглые скобки и запятые и так далее. Вы просто должны сделать это осторожно. Я предлагаю начать с более простых выражений, а затем строить.

...