2011-10-12 80 views
4

如何使用Zend_Db_Select直接從子查詢(派生表)中選擇?Zend_Db_選擇如何從子查詢(派生表)中選擇

請參閱我有5個具有相同結構的表,我想從它們中獲取所有行,合併它們並刪除重複項。我正在使用自動刪除重複的UNION。問題是我之前添加了一個靜態列到每個表,所以有一列是不同的=>重複發生。

這裏是我的查詢到目前爲止:

SELECT `news_main`.*, 'main' as `category` 
FROM `news_main` 
UNION SELECT `news_politics`.*, 'politics' as `category` FROM `news_politics` 
UNION SELECT `news_society`.*, 'society' as `category` FROM `news_society` 
UNION SELECT `news_world`.*, 'world' as `category` FROM `news_world` 
UNION SELECT `news_business`.*, 'business' as `category` FROM `news_business` 
ORDER BY `date` DESC LIMIT 8 

看我怎麼添加靜態值到新列category?現在一切都是一樣的(有重複的行),但由於它們來自不同的類別,UNION無法刪除它們。

所以我想我可以SELECT從這個子查詢,並將它們組合中的所有行刪除重複,像這樣:

SELECT * 
FROM (
    SELECT `news_main`.*, 'main' as `category` 
    FROM `news_main` 
    UNION SELECT `news_politics`.*, 'politics' as `category` FROM `news_politics` 
    UNION SELECT `news_society`.*, 'society' as `category` FROM `news_society` 
    UNION SELECT `news_world`.*, 'world' as `category` FROM `news_world` 
    UNION SELECT `news_business`.*, 'business' as `category` FROM `news_business` 
    ORDER BY `date` DESC LIMIT 8 
) as subtable 
GROUP BY `source` 
ORDER BY `date` DESC 

我沒有在MySQL運行這個和它的作品完美..唯一的問題是...

如何使用Zend_Db_Select的奇特功能執行此操作?

在此先感謝!

回答

1

我不知道,如果你可以在Zend_Db_Select的from結構中使用嵌套選擇,或者你甚至應該這樣做,但是另一種解決方案是獲取數據庫適配器並手動構建sql查詢。

$db = Zend_Db_Table::getDefaultAdapter(); 
$db->query("SELECT * 
    FROM (
     SELECT `news_main`.*, 'main' as `category` 
     FROM `news_main` 
     UNION SELECT `news_politics`.*, 'politics' as `category` FROM `news_politics` 
     UNION SELECT `news_society`.*, 'society' as `category` FROM `news_society` 
     UNION SELECT `news_world`.*, 'world' as `category` FROM `news_world` 
     UNION SELECT `news_business`.*, 'business' as `category` FROM `news_business` 
     ORDER BY `date` DESC LIMIT 8 
    ) as subtable 
    GROUP BY `source` 
    ORDER BY `date` DESC 
"); 

相關: Zend_Db_Table subquery

0

從我可以從Zend_Db_Select對象的源代碼告訴,其從()方法調用其_join()方法,它具有用於當從()中的第一個參數是一個Zend_Db_Select對象物體的情況下:http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Db/Select.php

} else if ($name instanceof Zend_Db_Expr|| $name instanceof Zend_Db_Select) { 
     $tableName = $name; 
     $correlationName = $this->_uniqueCorrelation('t'); 

如果沒有,()應當支持在括號迫使它包裹它被轉換爲Zend_Db_Expr實例作爲在這個例子joinRight()混疊子查詢:Zend Framework: Zend_Db_Select - how to join custom subquery table?

0

只要定義一個類引用您的子查詢,然後你就可以在它在一個地方添加更多的處理:

class Acme_Db_Expr_Subquery extends Zend_Db_Expr { 
    public function __toString() 
    { 
     return '(' . $this->_expression . ')'; 
    } 
} 

然後在FROM子句中使用它(我的例子,實際應用程序中的副本,工作)或JOIN(猜測,沒有嘗試)。

$innerSelect = $dbTableSomeModel->select(true); 
// Configure it, maybe kick around many layers of abstarction 

$nestedSelect->from(
    array(
     'derived_alias' => new Acme_Db_Expr_Subquery($innerSelect), 
    ) 
    ,array(
     'column_alias' => 'column_expression', 
    ) 
);