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

回答編集履歴

1

見直し

2021/05/31 05:45

投稿

退会済みユーザー
answer CHANGED
@@ -2,6 +2,27 @@
2
2
  とくにFORM要素があるようでもないし、ajaxにて送信しているわけでもない。
3
3
  そして、その「いいね」したときの記録はどのようにしているのでしょうか。
4
4
 
5
+ この下り:
6
+ ```php
7
+ // 全ての投稿を取得
8
+ $sql = "SELECT * FROM Post LEFT OUTER JOIN Members ON Post.member_id = Members.member_id ORDER BY post_date DESC";
9
+ $res = $db->query($sql);
10
+
11
+ if( $res ) {
12
+ $message_array = $res->fetchAll(PDO::FETCH_ASSOC);
13
+ }
14
+
15
+ // いいね数取得
16
+ $p_id = $value['post_id'];
17
+ $dbPostGoodNum = count(getGood($p_id));
18
+ ```
19
+ 投稿のすべてを取得するクエリーからじゃ、どう頑張ってもいいね数は取れないと思いますよ。
20
+ コピペで作るにしても雑すぎる。
21
+
22
+ コードを書いてないけど、`$value['post_id']`はもしかして`$_GET['post_id']`と勘違いしたとか?
23
+
24
+ ---
25
+
5
26
  憶測の上に推察しますが、
6
27
  LIKESテーブルに「いいね」を記録するものだとした場合、
7
28
  記録に係る処理がどこにもなさそうなので、
@@ -28,14 +49,22 @@
28
49
 
29
50
  投稿と一緒にいいね数を取得するのに、
30
51
  ```sql
31
- SELECT p.post_id, p.member_id, m.name, p.message, p.post_date
52
+ SELECT p.post_id, p.member_id, m.name, p.message, p.post_date, l.cnt
32
53
  FROM post AS p
33
54
  LEFT OUTER JOIN members AS m ON p.member_id = m.member_id
34
55
  LEFT OUTER JOIN (
35
- SELECT post_id, COUNT(like_id)
56
+ SELECT post_id, COUNT(like_id) AS cnt
36
57
  FROM likes
37
58
  GROUP BY post_id
38
59
  ) AS l on p.post_id = l.post_id
39
60
  ORDER BY p.post_date;
40
61
  ```
41
- みたいになるんですかね、あくまで机上のSQL。
62
+ みたいになるんですかね、あくまで机上のSQL。
63
+
64
+ function getGood() にて、
65
+ LIKESテーブルの全行を配列に読み込もうとしていますが、
66
+ PHPの配列上に何十行何百行何千行読み込むつもりでしょうか、
67
+ その上で配列を走査していいね数をカウントするくらいなら、
68
+ 通常その手の集計はSQLでデータベースに行わせてください。
69
+ 適切にインデックスも施されていれば、
70
+ サクッとカウントくらいできます。