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`

私はそれが怪物であり、明示的な結合を使用しない前に死ぬ人がいることを知っています. ただし、それを無視して、が 0 より大きい場合はCONCAT内部のみを使用し、そうでない場合は return のみを使用することを望みます。しかし、そこに を投げようとしても成功しませんでした。マニュアルを読みましたが、試したすべての方法が機能せず、条件文全体で何かが欠けていると確信しています。GROUP_CONCATmenu_items.pricemenu_items.nameIF

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> )

この関数には 3 つの引数があります。最初の引数は です<condition>。条件が true と評価された場合、関数は の結果を返します<true-expr>。それ以外の場合、関数は の結果を返します<false-expr>

括弧やコンマなどを含む非常に長い複数行の式を使用すると、正しく処理するのが難しくなります。慎重に行う必要があります。より単純な式から始めて、それから構築することをお勧めします。

于 2008-10-23T23:32:38.330 に答える