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

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

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

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

761閲覧

cakePHP 一つのテーブルで統計的にデータを取り出す

art_of

総合スコア21

MySQL

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/02/10 12:35

編集2019/02/11 05:17

前提・実現したいこと

cakePHPでのMySQLからのレコードの抽出についてです。
以下のようにテーブル構成をしています。
Postsテーブルで、ユーザーからのポストはmessageの内容によって種類をtypeで分類しています。
未分類のものはtypeを0にしており、ひとりのユーザーに対して、未分類のものがあればそのユーザーのそれ以前のポストは全て分類されているものとします。
そこで、未分類のポストを取得したいのですが、今までのポストでtypeを2に分類された数が多いユーザー順に取得したいです。
またpaginationも使いたいです。
どのようにpaginationに設定すればよろしいでしょうか。グループ化や、count関数を使って考えてみましたが、うまくいきませんでした。
解決方法があれば教えていただきたいです。

テーブル

Posts Table: ------------------------------------------------------------------------ | id | user_id | message | type | ------------------------------------------------------------------------ | 1 | 1 | message1 | 2 | ------------------------------------------------------------------------ | 2 | 2 | message2 | 2 | ------------------------------------------------------------------------ | 3 | 3 | message3 | 2 | ------------------------------------------------------------------------ | 4 | 1 | message4 | 1 | ------------------------------------------------------------------------ | 5 | 3 | message5 | 2 | ------------------------------------------------------------------------ | 6 | 2 | message6 | 1 | ------------------------------------------------------------------------ | 7 | 2 | message7 | 2 | ------------------------------------------------------------------------ | 8 | 3 | message8 | 2 | ------------------------------------------------------------------------ | 9 | 1 | message9 | 1 | ------------------------------------------------------------------------ | 10 | 1 | message10| 0 | ------------------------------------------------------------------------ | 11 | 2 | message11| 0 | ------------------------------------------------------------------------ | 12 | 4 | message12| 0 | ------------------------------------------------------------------------

期待している抽出結果

------------------------------------------------------------------------ | 11 | 2 | message11| 0 | ------------------------------------------------------------------------ | 10 | 1 | message10| 0 | ------------------------------------------------------------------------ | 12 | 4 | message12| 0 | ------------------------------------------------------------------------

現状

現状以下のようになっています。

$this->Post->find('all',array( 'fields' => array( ' (select count(*) from posts where user_id=t1.user_id and type=2) as cnt , t1.*' ), 'conditions' => array( 'type' => 0 ) 'order' => array( '1 desc' ) ))

以下のSQL文が発行されます

select (select count(*) from posts where user_id=t1.user_id and type=2) as cnt , t1.* from posts where type=0 order by 1 desc

当然、from posts t1とはなりません。
何か解決方法はあるでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DATA

1CREATE TABLE Posts 2 (id int, user_id int, message varchar(9), type int) 3; 4INSERT INTO Posts 5 (id, user_id, message, type) 6VALUES 7 (1, 1, 'message1', 2), 8 (2, 2, 'message2', 2), 9 (3, 3, 'message3', 2), 10 (4, 1, 'message4', 1), 11 (5, 3, 'message5', 2), 12 (6, 2, 'message6', 1), 13 (7, 2, 'message7', 2), 14 (8, 3, 'message8', 2), 15 (9, 1, 'message9', 1), 16 (10, 1, 'message10', 0), 17 (11, 2, 'message11', 0), 18 (12, 4, 'message12', 0) 19;

SQL

1select (select count(*) from posts where user_id=t1.user_id and type=2) as cnt 2 , t1.* 3from posts t1 4where type=0 5order by 1 desc

投稿2019/02/10 13:46

sazi

総合スコア25184

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

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

art_of

2019/02/11 03:48

回答ありがとうございます。 DB上でそのSQL文を叩くと、確かに希望通りの結果が得られました。 しかし、cakephpのfind文ではどのように表したら良いのかわかりませんでした。find文での解決方法はありませんでしょうか。
sazi

2019/02/11 03:57

現状どのように実装されているのか、コードを質問に追記した方が良いですね。
sazi

2019/02/11 03:59

mysqlだと「order by cnt desc」 のようにエイリアスでの指定もエラーにはならないとは思います。
art_of

2019/02/11 05:12

なるほど、ご指摘ありがとうございます。 現状、このように指定しているのですが ``` $this->Post->find('all',array( 'fields' => array( ' (select count(*) from posts where user_id=t1.user_id and type=2) as cnt , t1.*' ), 'conditions' => array( 'type' => 0 ), 'order' => array( '1 desc' ) )) ``` 実際に発行されるSQL文は以下のようになります。 ``` SELECT ((select count(*) from posts where user_id=t1.user_id and type=2) as cnt, t1.* FROM posts WHERE `type` = 0 ORDER BY `1` desc ``` 当然、From posts t1とはならないんですが、どのように解決すればよろしいでしょうか。
sazi

2019/02/11 05:15

テーブルのエイリアスを逆にしてみて下さい。 SELECT ((select count(*) from posts t1 where user_id=posts.user_id and type=2) as cnt, * FROM posts WHERE `type` = 0 ORDER BY `1` desc
art_of

2019/02/11 05:34

おお! そちらでうまく取得することができました。 本当に助かりました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問