teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

文書の修正

2015/10/08 04:44

投稿

KatsumiTanaka
KatsumiTanaka

スコア924

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  ```
19
19
 
20
20
  追記:
21
- 取得したことが、おおよそわかりました
21
+ 取得したことが、おおよそわかりました
22
22
  tagsに含まれているすべてのtagを持つpost_idを取得するのですね?
23
23
  例)tags=(a,b,c) post_id=1  tags=(a,b) post_id=2
24
24
 

1

詳細コードを追記しました

2015/10/08 04:44

投稿

KatsumiTanaka
KatsumiTanaka

スコア924

answer CHANGED
@@ -15,4 +15,68 @@
15
15
  'fields' => array('DISTINCT PostsTag.id')
16
16
  )
17
17
  );
18
- ```
18
+ ```
19
+
20
+ 追記:
21
+ 取得したことが、おおよそわかりました
22
+ tagsに含まれているすべてのtagを持つpost_idを取得するのですね?
23
+ 例)tags=(a,b,c) post_id=1  tags=(a,b) post_id=2
24
+
25
+ この場合のSQLは、以下のようなものになると思います
26
+ ```SQL
27
+ SELECT
28
+ posts_tag.post_id
29
+ FROM
30
+ irie.posts_tag
31
+ inner join
32
+ (select post_id from irie.posts_tag
33
+ where tag_id in ($tags)
34
+ group by post_id) temp_post_tag
35
+ on
36
+ temp_post_tag.post_id = posts_tag.post_id
37
+ group by
38
+ posts_tag.post_id
39
+ having
40
+ count(posts_tag.post_id) = $tagsの要素数
41
+ ```
42
+
43
+ このSQLはサブクエリを使用しているので、CakePHPのコードでは
44
+ 以下のように実装できると思います
45
+
46
+ ```PHP
47
+ $tags = array("a", "b", "c");
48
+ $cnt = count($tags);
49
+
50
+ // サブクエリ設定
51
+ $dbo = $this->PostsTag->getDataSource();
52
+ $subQuery = $dbo->buildStatement(
53
+ array(
54
+ 'table' => $dbo->fullTableName($this->PostsTag),
55
+ 'alias' => 'wkPostsTag',
56
+ 'fields' => array(
57
+ 'post_id'
58
+ ),
59
+ 'conditions' => array('wkPostsTag.tag_id' => $tags),
60
+ 'limit' => null,
61
+ 'joins' => array(),
62
+ 'order' => null,
63
+ 'group' => array('wkPostsTag.post_id')
64
+ ),
65
+ $this->PostsTag
66
+ );
67
+ // 本体設定
68
+ $options = array(
69
+ 'joins' => array(
70
+ array(
71
+ 'table' => "({$subQuery})",
72
+ 'alias' => 'wkPostsTag',
73
+ 'type' => 'INNER',
74
+ 'conditions' => 'wkPostsTag.post_id = PostsTag.post_id'
75
+ )
76
+ ),
77
+ 'fields' => array('PostsTag.post_id'),
78
+ 'group' => array("PostsTag.post_id HAVING count(PostsTag.post_id) = ".$cnt)
79
+ );
80
+ // 検索の実行
81
+ $data = $this->PostsTag->find('list',$options);
82
+ ```