簡體   English   中英

Zend_Db_Select如何從子查詢中選擇(派生表)

[英]Zend_Db_Select how to select from a subquery (derived table)

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

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

這是我目前的查詢:

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的花哨功能執行此操作?

提前致謝!

我不確定你是否可以在Zend_Db_Select的from結構中使用嵌套選擇,或者你是否應該這樣做,但另一種解決方案是獲取db適配器並手動構建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子查詢

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

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

然后在FROM子句中使用它(我的情況下,來自實際應用程序的copypaste,工作)或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',
    )
);

從我從Zend_Db_Select的源代碼中可以看出,它的from()方法調用它的_join()方法,該方法有一個情況,即from()的第一個參數是Zend_Db_Select對象: http://framework.zend。 COM / SVN /框架/標准/主干/庫/的Zend / DB / Select.php

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

如果沒有,from()應該支持別名子查詢,方法是將它包裝在括號中以強制它轉換為Zend_Db_Expr實例,如本例中的joinRight(): Zend Framework:Zend_Db_Select - 如何連接自定義子查詢表?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM