2013-06-21 54 views
1

您好我已經寫了一個有條件order by子句的MySQL語句,您可以在下面的示例中看到。Drupal db_select PDO聲明:ORDER BY CASE

的MySQL實例:

SELECT 
    title, 
    description 
FROM books 
WHERE 
    title LIKE "%keyword%" OR description LIKE "%keyword%" 
ORDER BY 
    CASE 
     WHEN title LIKE "%keyword%" 
     THEN 1 
     ELSE 2 
    END 

我現在想重新使用它的PDO風格db_select()函數在Drupal這一說法。但是在編寫ORDER BY子句時我遇到了困難。

Drupal的例子:

$node_select = db_select('node', 'n'); 
$node_select->fields('n', array('title', 'description')); 
$node_select->condition(
    db_or()->condition('n.title', '%'.$keyword.'%', 'LIKE') 
      ->condition('n.description', '%'.$keyword.'%', 'LIKE') 
); 
$node_select->order(); 

任何人都可以點我你會怎麼寫ORDER BY部分朝着正確的方向?

回答

4

我認爲你可以通過在select語句中添加一個表達式,然後將該字段作爲按字段的順序來添加。如果你確定在選擇列表中有額外的字段,這將僅適用。這工作是這樣的:

$query->addExpression('CASE WHEN title LIKE "%keyword%" THEN 1 ELSE 2 END', 'order_col'); 
$query->orderBy('order_col', 'ASC'); 

我不認爲你可以專門的排序依據子句中使用表達式,但是這應該爲你工作。

+0

真棒,它做了謝謝。 –

+0

使用addExpression和countQuery我遇到了一個問題,但它是一個簡單的修復,一旦你閱讀這個http://drupal.stackexchange.com/questions/19032/d7-bug-with-db-select-addexpression-and-having -條件 –