4

テーブルがpostあり、そのスキーマは次のようになります。

CREATE TABLE IF NOT EXISTS `post` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `site_id` bigint(20) DEFAULT NULL,
  `parent_id` bigint(20) DEFAULT NULL,
  `title` longtext COLLATE utf8_turkish_ci NOT NULL,
  `status` varchar(20) COLLATE utf8_turkish_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_5A8A6C8DA76ED395` (`user_id`),
  KEY `IDX_5A8A6C8DF6BD1646` (`site_id`),
  KEY `IDX_5A8A6C8D727ACA70` (`parent_id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=16620 ;

この DQL を使用して投稿をフェッチしていますが、それは子です。

$post = $this->_diContainer->wordy_app_doctrine->fetch(
           "SELECT p,c FROM Wordy\Entity\Post p LEFT JOIN p.children c WHERE p.site = :site AND p.id = :id AND p.language = :language AND p.status != 'trashed'  AND c.status != 'trashed' ORDER BY c.title",
           array(
               'params' => array(
               'id' => $id,
               'site' => $this->_currentSite['id'],
               'language' => $this->_currentLanguage->code,
           )
       )
   );

私がやろうとしているのは、投稿を取得し、そのすべてが子であることです。基準は、ゴミ箱に捨てられた投稿やゴミ箱に捨てられた子供を含めないことです。

しかし、子さえ持たない投稿でこのクエリを実行すると、返される結果セットは空です。

クエリからパーツを削除するとc.status != 'trashed'、すべて正常に機能しますが、投稿がゴミ箱に移動します。

前もって感謝します。

編集:これは、指定されたDQLのSQL出力です:

SELECT p0_.id AS id0, p0_.title AS title5, p0_.status AS status8, p0_.parent_id AS parent_id9, p1_.id AS id15, p1_.title AS title20, p1_.status AS status23, p1_.parent_id AS parent_id24 FROM post p0_ LEFT JOIN post p1_ ON p0_.id = p1_.parent_id WHERE p0_.site_id = ? AND p0_.id = ? AND p0_.language = ? AND p0_.status <> 'trashed' ORDER BY p1_.title ASC
4

3 に答える 3

1

結合後に長い条件付きの WHERE が AND 結合されており、すべてのチェックに合格するものはありません。結合部分を ON 句に移動し、c.trashed チェックを WHERE 句に残します。次のようなことを試してください:

SELECT p,c FROM Wordy\Entity\Post p LEFT JOIN children c ON p.site = :site AND p.id = :id AND p.language = :language AND p.status != 'trashed' AND p.id = c.parent_id  WHERE   c.status != 'trashed' ORDER BY c.title
于 2012-07-17T16:33:14.263 に答える
1

私は自分の問題を解決したと思います。

次のように、句の代わりwithにフィールドで句を使用するだけです。joinwhere

"SELECT p,c FROM Wordy\Entity\Post p LEFT JOIN p.children c WITH c.status != 'trashed' WHERE p.site = :site........."
于 2012-07-17T16:46:29.600 に答える
1

左結合構文ONの句を忘れました。

于 2012-07-17T16:34:53.767 に答える