質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

307閲覧

ブログ記事の投稿一覧を表示させる際、その記事についたイイネ(レコード数)を集計したい

chapp

総合スコア233

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/09/05 11:43

お世話になります。お恥ずかし質問かと思いますが、質問させてください。
質問したいことは、質問のタイトルにありますように、ブログ記事の投稿一覧を表示させる際、その記事についたイイネ(レコード数)の集計です。

ブログ記事のテーブルは以下の通りです。
テーブル名(news)
news_no news_category_no news_title
1 1 美味しいです
2 2 甘いです
3 1 不味いです

記事に付随するカテゴリテーブルは以下の通りです。
テーブル名(category)
category_no category_name
1 野菜
2 果物

※news_category_noと、category_noは紐付いています。

上記だけの場合、ブログ記事の投稿一覧のSQLは、

$sql = "SELECT news.news_no, news.news_category_no, news.news_title, category.category_no, category.category_name FROM news LEFT JOIN category ON news.news_category_no = category.category_no ORDER BY news.news_no";

となるかと思いますが、この記事に対してイイネを設けており、そのイイネのテーブルが以下のようになっています。

like_no like_news_no
1 1
2 2
3 1
4 3

※newsテーブルのnews_noと、likeテーブルのlike_news_noとが紐づいています。

以上のような構成ですが、ブログの投稿記事一覧を表示させる際、

美味しいです(2)
甘いです(1)
不味いです(1)

とさせたく、試行錯誤ながらSQLを

$sql = "SELECT news.news_no, news.news_category_no, news.news_title, category.category_no, category.category_name, count(like_news.like_no) as `count` FROM news LEFT JOIN category ON news.news_category_no = category.category_no LEFT JOIN like_news ON news.news_no = like_news.like_news_no GROUB BY news.news_no ORDER BY news.news_no";

としていますが、上手くいきません。
色々と検索もしているのですが、探している情報にもたどり着けずこの度質問させて頂きました。
お忙しい中恐縮ですが、アドバイスのほどお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんな感じ?

SQL

1SELECT 2 news.news_no, 3 news.news_category_no, 4 news.news_title, 5 category.category_no, 6 category.category_name, 7 (select count(*) from like_news where like_news_no=news.news_no) as `count` 8FROM news LEFT JOIN category ON news.news_category_no=category.category_no 9ORDER BY news.news_no

投稿2017/09/05 13:43

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2017/09/05 14:54

soziさま お疲れのところご親切なアドバイスをありがとうございます。 シンプルなソースで実現できるのですね。先のKiyoshiMotokiさまとの比較で勉強になりました。 とはいえ「ベストアンサー」にしなければならず、若干ではありましたが、KiyoshiMotokiさまの方が早かったことあり、ベストアンサーは控えさせていただきますが、この度のアドバイスには感謝しています。本当、シンプルなソースで実現できるのですね。ありがとうございました!
guest

0

ベストアンサー

sql

1SELECT 2news.news_no, 3news.news_category_no, 4news.news_title, 5category.category_no, 6category.category_name, 7tmp.cnt 8FROM news 9LEFT JOIN category ON news.news_category_no = category.category_no 10LEFT JOIN (SELECT like_news_no, COUNT(*) AS cnt FROM like_news GROUP BY like_news_no) AS tmp 11 ON news.news_no = tmp. like_news_no 12ORDER BY news.news_no;

実行結果

mysql> CREATE TABLE news ( -> news_no INT, -> news_category_no INT, -> news_title VARCHAR(16) -> ); Query OK, 0 rows affected (0.02 sec) mysql> CREATE TABLE category ( -> category_no INT, -> category_name VARCHAR(4) -> ); Query OK, 0 rows affected (0.02 sec) mysql> CREATE TABLE like_news ( -> like_no INT, -> like_news_no INT -> ); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO news VALUES -> (1, 1, '美味しいです'), -> (2, 2, '甘いです'), -> (3, 1, '不味いです'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> INSERT INTO category VALUES -> (1, '野菜'), -> (2, '果物'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> INSERT INTO like_news VALUES -> (1, 1), -> (2, 2), -> (3, 1), -> (4, 3); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT -> news.news_no, -> news.news_category_no, -> news.news_title, -> category.category_no, -> category.category_name, -> tmp.cnt -> FROM news -> LEFT JOIN category ON news.news_category_no = category.category_no -> LEFT JOIN (SELECT like_news_no, COUNT(*) AS cnt FROM like_news GROUP BY like_news_no) AS tmp -> ON news.news_no = tmp. like_news_no -> ORDER BY news.news_no; +---------+------------------+--------------------+-------------+---------------+------+ | news_no | news_category_no | news_title | category_no | category_name | cnt | +---------+------------------+--------------------+-------------+---------------+------+ | 1 | 1 | 美味しいです | 1 | 野菜 | 2 | | 2 | 2 | 甘いです | 2 | 果物 | 1 | | 3 | 1 | 不味いです | 1 | 野菜 | 1 | +---------+------------------+--------------------+-------------+---------------+------+ 3 rows in set (0.00 sec)

Update

上記の SQLだと、1つも「イイネ」されていない投稿の「イイネ数」(cntカラム)はNULLになります。

そのような投稿の「イイネ数」を 0 として取得したい場合は、以下のようにすると良いでしょう。

sql

1SELECT 2news.news_no, 3news.news_category_no, 4news.news_title, 5category.category_no, 6category.category_name, 7IFNULL(tmp.cnt, 0) AS cnt 8FROM news 9LEFT JOIN category ON news.news_category_no = category.category_no 10LEFT JOIN (SELECT like_news_no, COUNT(*) AS cnt FROM like_news GROUP BY like_news_no) AS tmp 11 ON news.news_no = tmp. like_news_no 12ORDER BY news.news_no;

実行結果

mysql> INSERT INTO news VALUES (4, 2, '果物です'); Query OK, 1 row affected (0.01 sec) mysql> SELECT -> news.news_no, -> news.news_category_no, -> news.news_title, -> category.category_no, -> category.category_name, -> IFNULL(tmp.cnt, 0) AS cnt -> FROM news -> LEFT JOIN category ON news.news_category_no = category.category_no -> LEFT JOIN (SELECT like_news_no, COUNT(*) AS cnt FROM like_news GROUP BY like_news_no) AS tmp -> ON news.news_no = tmp. like_news_no -> ORDER BY news.news_no; +---------+------------------+--------------------+-------------+---------------+-----+ | news_no | news_category_no | news_title | category_no | category_name | cnt | +---------+------------------+--------------------+-------------+---------------+-----+ | 1 | 1 | 美味しいです | 1 | 野菜 | 2 | | 2 | 2 | 甘いです | 2 | 果物 | 1 | | 3 | 1 | 不味いです | 1 | 野菜 | 1 | | 4 | 2 | 果物です | 2 | 果物 | 0 | +---------+------------------+--------------------+-------------+---------------+-----+ 4 rows in set (0.01 sec)

投稿2017/09/05 12:29

編集2017/09/05 12:36
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2017/09/05 14:51

KiyoshiMotokiさま お疲れのところ早々のアドバイスをありがとうございます。 それぞれの実行において分かりやすくお示しいただき、感謝いたします。 無事、解決いたしました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問