回答編集履歴

2

文書の修正

2015/10/08 04:44

投稿

KatsumiTanaka
KatsumiTanaka

スコア924

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  追記:
40
40
 
41
- 取得したことが、おおよそわかりました
41
+ 取得したことが、おおよそわかりました
42
42
 
43
43
  tagsに含まれているすべてのtagを持つpost_idを取得するのですね?
44
44
 

1

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

2015/10/08 04:44

投稿

KatsumiTanaka
KatsumiTanaka

スコア924

test CHANGED
@@ -33,3 +33,133 @@
33
33
  );
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ 追記:
40
+
41
+ 取得したことが、おおよそわかりました
42
+
43
+ tagsに含まれているすべてのtagを持つpost_idを取得するのですね?
44
+
45
+ 例)tags=(a,b,c) post_id=1  tags=(a,b) post_id=2
46
+
47
+
48
+
49
+ この場合のSQLは、以下のようなものになると思います
50
+
51
+ ```SQL
52
+
53
+ SELECT
54
+
55
+ posts_tag.post_id
56
+
57
+ FROM
58
+
59
+ irie.posts_tag
60
+
61
+ inner join
62
+
63
+ (select post_id from irie.posts_tag
64
+
65
+ where tag_id in ($tags)
66
+
67
+ group by post_id) temp_post_tag
68
+
69
+ on
70
+
71
+ temp_post_tag.post_id = posts_tag.post_id
72
+
73
+ group by
74
+
75
+ posts_tag.post_id
76
+
77
+ having
78
+
79
+ count(posts_tag.post_id) = $tagsの要素数
80
+
81
+ ```
82
+
83
+
84
+
85
+ このSQLはサブクエリを使用しているので、CakePHPのコードでは
86
+
87
+ 以下のように実装できると思います
88
+
89
+
90
+
91
+ ```PHP
92
+
93
+ $tags = array("a", "b", "c");
94
+
95
+ $cnt = count($tags);
96
+
97
+
98
+
99
+ // サブクエリ設定
100
+
101
+ $dbo = $this->PostsTag->getDataSource();
102
+
103
+ $subQuery = $dbo->buildStatement(
104
+
105
+ array(
106
+
107
+ 'table' => $dbo->fullTableName($this->PostsTag),
108
+
109
+ 'alias' => 'wkPostsTag',
110
+
111
+ 'fields' => array(
112
+
113
+ 'post_id'
114
+
115
+ ),
116
+
117
+ 'conditions' => array('wkPostsTag.tag_id' => $tags),
118
+
119
+ 'limit' => null,
120
+
121
+ 'joins' => array(),
122
+
123
+ 'order' => null,
124
+
125
+ 'group' => array('wkPostsTag.post_id')
126
+
127
+ ),
128
+
129
+ $this->PostsTag
130
+
131
+ );
132
+
133
+ // 本体設定
134
+
135
+ $options = array(
136
+
137
+ 'joins' => array(
138
+
139
+ array(
140
+
141
+ 'table' => "({$subQuery})",
142
+
143
+ 'alias' => 'wkPostsTag',
144
+
145
+ 'type' => 'INNER',
146
+
147
+ 'conditions' => 'wkPostsTag.post_id = PostsTag.post_id'
148
+
149
+ )
150
+
151
+ ),
152
+
153
+ 'fields' => array('PostsTag.post_id'),
154
+
155
+ 'group' => array("PostsTag.post_id HAVING count(PostsTag.post_id) = ".$cnt)
156
+
157
+ );
158
+
159
+ // 検索の実行
160
+
161
+ $data = $this->PostsTag->find('list',$options);
162
+
163
+ ```
164
+
165
+