1

好的,所以我有一个如下所示的查询:

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_CONCATifmenu_items.price大于 0,否则只使用 return menu_items.name。然而,我没有成功尝试IF在那里扔一个。我已经阅读了手册,但我尝试过的所有方法都不起作用,我很确定我在整个条件语句的事情上遗漏了一些东西。

4

2 回答 2

5

你试过用这样的东西吗?

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

当然是替换CONCAT语句。

于 2008-10-23T22:45:37.207 回答
1

像这样的东西应该可以工作(但我没有测试它,抱歉):

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-expr>。否则该函数返回的结果<false-expr>

当您使用包含括号和逗号等的非常长的多行表达式时,事情会变得更难。你只需要小心翼翼地去做。我建议从更简单的表达式开始,然后建立。

于 2008-10-23T23:32:38.330 回答