2009-12-08 62 views
11

我在MySQL有一個查詢:主義 - 子查詢從

SELECT * FROM (
    SELECT COUNT(*) AS count, t.name AS name 
    FROM tag t 
    INNER JOIN video_has_tag v USING (idTag) 
    GROUP BY v.idTag 
    ORDER BY count DESC 
    LIMIT 10 
) as tags ORDER BY name 

,我想在教義來寫這個。我該怎麼做?我寫道:

Doctrine_Query::create() 
     ->select('COUNT(t.idtag) as count, t.name') 
     ->from('Tag t') 
     ->innerJoin('t.VideoHasTag v') 
     ->groupBy('v.idTag') 
     ->orderBy('count DESC, t.name') 
     ->limit(30) 
     ->execute(); 

但我不能把它放在「從」按名稱排序。

+0

你的意思是:'把它放在'從'按名稱排序'? – 2009-12-08 20:59:50

+0

做主義支持子查詢? (...) – Yada 2009-12-08 21:46:27

+0

@Chris Williams:看看mysql的查詢:) @Yada:當我把整個查詢放在from()Doctrine中說我「(SELECT」表不存在 – snapshot 2009-12-08 22:19:38

回答

9

這是一個答案:

$q = new Doctrine_RawSql(); 
$q->addComponent('t', 'Tag') 
    ->select('{t.name}, {t.count}') 
    ->from('(SELECT COUNT(*) as count, t.name,t.idtag 
     FROM Tag t 
      INNER JOIN Video_Has_Tag v USING(idTag) 
     GROUP BY v.idTag 
     ORDER BY count DESC 
     LIMIT 50) t') 
    ->orderBy('name'); 
1

學說不能在FROM子句中做子查詢(也不能加入子查詢)。您目前的Doctrine查詢將按計數排序,然後按名稱排序。這不是你想要的嗎?

+0

現在,它是按數量排序,什麼時候是相同的價值,它是按名稱排序。我想獲得標籤雲標籤:10個標籤的最大數量按名稱排序 – snapshot 2009-12-09 09:34:27

0

學說會讓你把一個子查詢放在FROM子句中。但是,它只能在子查詢中使用DQL文本語句,而不能實際使用其他查詢對象。如果您以文本形式重寫您的DQL子查詢,您應該可以使用它。

查看this page of the documentation爲例。該示例將DQL子查詢放在WHERE子句中,但它提到您可以在FROM子句中使用子查詢。

+0

我寫道: $ tags = Doctrine_Query :: create() - > from ('(SELECT COUNT(*)as count,t.name FROM Tag t INNER JOIN t.VideoHasTag v GROUP BY v.idTag ORDER BY count DESC LIMIT 30)as tags') - > orderBy('name') - >執行(); 和我得到「無法找到類(SELECT」 – snapshot 2009-12-09 09:40:04

+2

學說不*)*支持FROM子句中的子查詢,儘管文檔說:http://groups.google。 com/group/doctrine-user/browse_thread/thread/7572bf091e822b1f/d72952f5aa1378ee – EvanK 2010-01-15 16:42:18

2

我用主義1.2Symfony的1.4Doctrine_RawSql作品與子查詢。您可以使用addComponent模型。

東西值得提的是,你不能直接使用Doctrine_Query對象子查詢,你可以很容易地通過getSqlQuery()方法獲得SQL形式,甚至getSqlQueryPart和使用結果的子查詢。

getSqlQueryPart僅用於重建查詢的某些部分。

+0

Doctrine_RawSql() – 2016-12-14 13:42:26