TODO
1. 最初の1件のみ取得する方法を調べる
2. 1を利用してSQL文を書いて実行
SELECT * FROM records LIMIT 1;
SELECT * MIN(id) FROM records;
SELECT * FROM records WHERE MIN(id);
SELECT * FROM records GROUP BY id HAVING MIN(id);
# SQL Ateam
問題: 3
TODO
1. 指定したカラムを取得する方法を調べる
2. 1を利用してSQL文を書いて実行
---
問題: 4
TODO
1. レコードを絞り込む方法を調べる
2. 1を利用してSQL文を書いて実行
---
問題: 5
TODO
1. 文字列を含む条件(like)の使い方を調べる
2. 1を利用してSQL文を書いて実行
---
問題: 6
TODO
1. 文字列を含む条件(like)の使い方を調べる
2. 1を利用してSQL文を書いて実行
SELECT文②
---
問題: 1
TODO
1. 空ではないデータの取得の仕方を調べる
2. SQL文を書いて実行
SELECT accessLogId,zipcode,prefecture,facility,name FROM access_logs WHERE zipcode != '';
SELECT accessLogId,zipcode,prefecture,facility,name FROM access_logs WHERE zipcode IS NOT NULL;
---
問題: 2
TODO
1. prefectureが佐賀県のデータを絞り込む
2. entryPageにliveが含まれているデータをlikeを使って絞り込む
3. アクセスログID都道府県、氏名、エントリーページを表示するSQLを書く
4. 実行
SELECT accessLogId, prefecture, name, entryPage FROM access_logs WHERE prefecture = '佐賀県' AND entryPage LIKE '%live%';
---
問題: 3
TODO
1. 3時台入室(accessTime)と4時台入室(accessTime)絞り込む(どちらも午前)
2. COUNTを使って↑で絞り込んだログを数える
3. この結果を表示するSQLを書く
4. 実行
SELECT COUNT(*)
FROM access_logs
WHERE accessTime BETWEEN '2023-01-22 03:00' AND '2023-01-22 04:59';
WHERE date BETWEEN '2023-01-22 03:00' AND '2023-01-22 04:59';()
---
問題: 4
TODO
1. confNameが「テスト29講演会」のデータのconferenceInfoIdを取得する。
2. それを持つaccess_logsのaccessTimeを表示する
3. accessTimeを時間が早い順で並び替える
4. その結果を表示するSQLを書く
SELECT
conferenceInfoId
FROM
conference_infos
WHERE
confName = 'テスト29講演会'
SELECT
*
FROM
access_logs
WHERE
conference_info_id = (
SELECT
conferenceInfoId
FROM
conference_infos
WHERE
confName = 'テスト29講演会')
---
問題: 5
TODO
1. prefectureが東京都と北海道のレコードを取得する(それぞれ)
2. 都道府県別にレコードの数をカウントする
3. 都道府県のカラムと都道府県の数のカラム(prefCount)を用意
4. 実行!
SELECT
*
FROM
access_logs
WHERE
conference_info_id = (
SELECT
conferenceInfoId
FROM
conference_infos
WHERE
confName = 'テスト29講演会')
SELECT
COUNT(prefecture = '東京都') AS 東京都,
COUNT(prefecture = '北海道') AS 北海道
FROM
access_logs;
---
問題: 6
TODO
1. 問題5の回答コードを引用する
2. 都道府県別にレコードの数をカウントする
3. カウントが40以上の都道府県のみ表示する
4. 実行!
SELECT
prefecture
, COUNT(prefecture) AS prefecture_count
FROM
access_logs
WHERE
COUNT(prefecture) >= 40
GROUP BY
prefecture
;
SELECT
prefecture
, COUNT(prefecture) AS prefecture_count
FROM
access_logs
GROUP BY
prefecture
HAVING prefecture_count >= 40
;
---
問題: 1
TODO
テーブルを結合する方法を調べる
結合するためのキーを調べる
access_logs enquete_answersを結合する
結合するQ結果を実行
表示するカラムを絞る
accessLogID, uid, name, created_at
SQL実行
カラム名を変更する
SQL実行
SELECT
access_logs.accessLogId AS access_logs_accessLogId,
access_logs.uid AS access_logs_uid,
access_logs.name AS access_logs_name,
access_logs.created_at AS access_logs_created_at,
enquete_answers.id AS enquete_answers_id,
enquete_answers.uid AS enquete_answers_uid
FROM
access_logs
LEFT JOIN
enquete_answers
ON
access_logs.accessLogId = enquete_answers.access_log_id;
---
問題: 2
TODO
1. テーブル3つの時の結合方法を調べる
2. 問1を参考にSQL文を記載
3. 実行
SELECT
access_logs.accessLogId AS access_logs_accessLogId,
access_logs.uid AS access_logs_uid,
access_logs.name AS access_logs_name,
access_logs.created_at AS access_logs_created_at,
enquete_answers.id AS enquete_answers_id,
enquete_answers.uid AS enquete_answers_uid,
user_lists.userID AS user_list_userID,
user_lists.userPassword AS user_list_userPassword
FROM
access_logs
LEFT JOIN
enquete_answers
ON
access_logs.accessLogId = enquete_answers.access_log_id
LEFT JOIN
user_lists
ON
access_logs.user_list_id = user_lists.userListId;
---
問題: 3
TODO
テスト25講演会のアクセスログデータを絞り込む
表示するカラム名を変更
ID,PWをユニークで絞り込む
acssecTimeが最小のものを絞り込む
stopTimeが最大のものを絞り込む
SQL実行
SELECT
access_logs.conference_info_id AS access_logs_conference_info_id,
access_logs.accessLogId AS access_logs_accessLogId,
access_logs.uid AS access_logs_uid,
access_logs.name AS access_logs_name,
access_logs.accessTime AS access_logs_accessTime,
access_logs.stopTime AS access_logs_stopTime,
user_lists.userID AS user_list_userID,
user_lists.userPassword AS user_list_userPassword
FROM
access_logs
LEFT JOIN
user_lists
ON
access_logs.user_list_id = user_lists.userListId
WHERE
access_logs.conference_info_id = (
SELECT
conference_infos.conferenceInfoId
FROM
conference_infos
WHERE
confName = 'テスト25講演会')
GROUP BY
-----
問題: 1
TODO
アクセスログを基準としてアンケートログが結合されたアクセスログを表示
表示させるカラム名をエイリアスを付与していい感じに
テスト3講演会のアクセスログを表示させる
都道府県と施設の文字をつなげて表示させる→エイリアス付与
SELECT
access_logs.uid as log_uid
, CONCAT (access_logs.prefecture, access_logs.facility) as pref_facility
, access_logs.name as log_name
, enquete_answers.answer1 as answer1
, enquete_answers.answer2 as answer2
, enquete_answers.answer3 as answer3
, enquete_answers.answer4 as answer4
, enquete_answers.answer5 as answer5
FROM
access_logs
LEFT JOIN
enquete_answers
ON
access_logs.accessLogID = enquete_answers.access_log_id
WHERE
access_logs.conference_info_id = 3
;
問題: 2
TODO
アクセスログを表示
テスト29講演会のアクセスログを表示させる
都道府県が「奈良県」と「群馬県」のもののアクセスログを表示させる
都道府県、参加人数の平均、参加人数の合計を表示
表示させるカラム名をエイリアスを付与していい感じに
平均の小数点を切り捨てる
SELECT
prefecture
, TRUNCATE(AVG(participants_number), 0) AS pref_avg
, SUM(participants_number) AS pref_sum
FROM
access_logs
WHERE
conference_info_id = 10
AND
(prefecture = '奈良県' OR prefecture = '群馬県')
GROUP BY
prefecture
;
ーーー
問題: 3
TODO
アクセスログを表示
テスト29講演会のアクセスログを表示させる
IPアドレスがユニークなデータを表示
ユーザーエージェントは非表示
本番視聴ログのみ表示
エイリアスいい感じ
SELECT
COUNT(DISTINCT hostIP) AS 'unique'
FROM
access_logs
WHERE
conference_info_id = 29
AND
userAgent
NOT LIKE
'%Firefox%'
AND
entryPage
LIKE
'%live%'
;
ーーー
問題: 1
TODO
アンケートログの表示
表示するカラムを設定
カラム名を変更
イベントごとの平均値を出す
全イベントの平均値を出す
SELECT
event_id
, e_ans1_avg
, AVG(all_ans1_avg) AS all_ans1_avg_yoshida
FROM(
SELECT
conference_info_id AS event_id
, AVG(answer1) AS e_ans1_avg
, answer1 AS all_ans1_avg
, AVG(answer2) AS e_ans2_avg
, answer2 AS all_ans2_avg
, AVG(answer3) AS e_ans3_avg
, answer3 AS all_ans3_avg
, AVG(answer4) AS e_ans4_avg
, answer4 AS all_ans4_avg
, AVG(answer5) AS e_ans5_avg
, answer5 AS all_ans5_avg
FROM
enquete_answers
GROUP BY
conference_info_id
) AS table1
GROUP BY
event_id
SELECT
conference_info_id AS event_id
, AVG(answer1) AS ans1_avg
, (SELECT
AVG(answer1)
FROM
enquete_answers) AS all_ans1_avg
, AVG(answer2) AS ans2_avg
, (SELECT
AVG(answer2)
FROM
enquete_answers) AS all_ans2_avg
, AVG(answer3) AS ans3_avg
, (SELECT
AVG(answer3)
FROM
enquete_answers) AS all_ans3_avg
, AVG(answer4) AS ans4_avg
, (SELECT
AVG(answer4)
FROM
enquete_answers) AS all_ans4_avg
, AVG(answer5) AS ans5_avg
, (SELECT
AVG(answer5)
FROM
enquete_answers) AS all_ans5_avg
FROM
enquete_answers
GROUP BY
conference_info_id
ーーー
問題: 2
TODO
アクセスログのテーブルからデータを取得する
テスト1講演会に絞り込む
表示するカラムを設定する
→アクセスログID
→入室時間
→判別結果
入室時間のフォーマットをする
「2023-01-27 19:10:00 > 入室時間」であるかどうかを判別する
SELECT
accessLogId
, DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i') AS accessTime
, (CASE
WHEN DATE_FORMAT('2023-01-27 19:10:00', '%Y-%m-%d %k:%i') >= accessTime THEN "合格"
ELSE "不合格"
END) AS yas
FROM
access_logs
WHERE
conference_info_id = 1
;
ーーー
問題: 3
TODO
access_logsテーブルからデータを取得
表示するカラムを設定する
入室時間のフォーマットを設定する
最後にアクセスしたレコードを取得する
最後にアクセスした人のアクセスログIDを取得する ←いまここ
講演会ごとに出力して終わり。
accessLogId: (MAX(DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i')) AS accessTime)を持つ人のIDを入れる
SELECT
conference_info_id
, accessLogId
, DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i') AS accessTime
FROM
access_logs
WHERE
accessTime = (
SELECT MAX(DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i'))
FROM
access_logs
)
;
SELECT
conference_info_id
, accessLogId
, DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i') AS accessTime
FROM
access_logs
よさそうなサイトを見つけたのでここで共有しておきます
https://www.yuulinux.tokyo/17432/
ーーー
問題: 1
TODO
INSERTを使用してデータ作成者にチーム名を入力
INSERTを使用して講演会名に「班員の誰かの名前 + 講演会」 を入力
INSERTを使用してデータ作成時間とデータ更新時間には現在時刻を入力
それ以外のカラムはNULL
INSERT INTO
sql_plactice_logs (
created_by, conf_name, created_at, updated_at
)
VALUES (
'Aチーム', '谷亞樹講演会', now(), now()
)
;
ーーー
問題: 2
TODO
UPDATEするIDを調べる
UPDATEを使用して講演会名に「班員の誰かの名前 + 講演会」 を入力
UPDATEを使用してデータ作成時間とデータ更新時間には現在時刻を入力
UPDATE sql_plactice_logs
SET conf_info = '谷亞樹', updated_at = now()
WHERE
id = 32
;
ーーー
問題: 3
TODO
INSERTを使用して講演会名に「班員の誰かの名前 + 講演会」 を入力
INSERTを使用して講演会日に(データ1件目: 本日の日付)
INSERTを使用して講演会時間に(データ1件目: 現在時刻から1時間後)
INSERTを使用して入室時間は任意の時間を入力
INSERTを使用して退出時間は任意の時間を入力
INSERTを使用して参加人数は班員の人数を入力
INSERTを使用してデータ作成時間とデータ更新時間には現在時刻を入力
その他のカラムはNullとする
2件目は明日、3件目は1か月後の時間に変更して上記の内容を繰り返す
INSERT INTO
sql_plactice_logs (
created_by, conf_name, conf_date, conf_time, access_time, stop_time, participants_number, created_at, updated_at
)
VALUES (
'Aチーム', '御厨講演会', CURRENT_DATE(), ADDTIME(now(), '01:00:00'), '2023-02-15 13:14', '2023-02-15 13:15', 6, now(), now()
)
;
INSERT INTO
sql_plactice_logs (
created_by, conf_name, conf_date, conf_time, access_time, stop_time, participants_number, created_at, updated_at
)
VALUES (
'Aチーム', '天才御厨講演会(大好評)', DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY), DATE_ADD(now(), INTERVAL 1 DAY), '2023-02-15 13:14', '2023-02-15 13:15', 6, now(), now()
)
;
INSERT INTO
sql_plactice_logs (
created_by, conf_name, conf_date, conf_time, access_time, stop_time, participants_number, created_at, updated_at
)
VALUES (
'Aチーム', '勝又講演会', DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), DATE_ADD(now(), INTERVAL 1 MONTH), '2023-02-15 13:14', '2023-02-15 13:15', 6, now(), now()
)
;
INSERT INTO
sql_plactice_logs (
created_by, conf_name, conf_date, conf_time, access_time, stop_time, participants_number, created_at, updated_at
)
VALUES (
'Aチーム', '御厨講演会', CURRENT_DATE(), ADDTIME(now(), '01:00:00'), '2023-02-15 13:14', '2023-02-15 13:15', 6, now(), now()
),
(
'Aチーム', '天才御厨講演会(大好評)', DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY), DATE_ADD(now(), INTERVAL 1 DAY), '2023-02-15 13:14', '2023-02-15 13:15', 6, now(), now()
),
(
'Aチーム', '勝又講演会', DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), DATE_ADD(now(), INTERVAL 1 MONTH), '2023-02-15 13:14', '2023-02-15 13:15', 6, now(), now()
)
;
ーーー
問題: 4
TODO
UPDATE(id指定)で上書きをする対象を決める(47~49)
それぞれの講演日が本日と一致しているか判別する
結果をlecture_todayに反映
退室時間と入室時間の差を求めて、stay_timeに反映
データ更新時間を現在時間に更新
同時に3つ書き換える
UPDATE sql_plactice_logs
SET
lecture_today = CASE WHEN conf_date = CURRENT_DATE() THEN true
ELSE false
END
, stay_time = TIMEDIFF(stop_time, access_time)
, updated_at = now()
WHERE
id IN(47, 48, 49)
;
ーーー
問題: 5
TODO
Aチームで絞る
該当レコードを削除する
→(DELETEを使う?)
DELETE
FROM
sql_plactice_logs
WHERE
created_by = 'Aチーム'
;
ーーー
■平田さんの問題
ver5のブートストラップを使う
↑をheadタグに入れる(afterを使う)
class="btn btn-primary"をボタンのIDに追加する
↓バージョン5のブーツストラップ
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
ーーー
問題: 1
TODO
enquete_answersのテーブルからデータを取得
カラムは全て取得
conference_info_idが3のレコードを取得
取得したものの中から1問目の回答が2のレコードを取得
問1のカラム名:answer1
回答:2
取得したものの中から2問目の回答が3のレコードを取得
取得したものの中から3問目の回答が3のレコードを取得
取得したものの中から4問目の回答が3のレコードを取得
取得したものの中から5問目の回答が1のレコードを取得
SELECT
*
FROM
enquete_answers
WHERE
conference_info_id = 3
AND
answer1 = 2
AND
answer2 = 3
AND
answer3 = 3
AND
answer4 = 3
AND
answer5 = 1
;
ーーー
問題: 2
TODO
access_logsのテーブルからデータを取得
カラムは「都道府県 - 施設 / 氏名」「accessTime」「stopTime」を準備
都道府県と施設と氏名のデータを連結して、カラムを生成
データを取得→データを連結(調べる)→カラムを生成
アクセスタイムを取得
ストップタイムを取得
カラム名をそれぞれに付ける
ストップタイムが降順になるように並び変える
→BY stopTime DESC
上から10件のみ表示
→LIMIT 10
日付のフォーマットをする
→フォーマット:「%Y-%m-%d %k:%i:%s」
→DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i:%s')
→DATE_FORMAT(stopTime, '%Y-%m-%d %k:%i:%s')
SELECT
CONCAT(IFNULL(prefecture, ''), '-', IFNULL(facility, ''), '/', IFNULL(name, '')) AS '都道府県 - 施設 / 氏名'
, DATE_FORMAT(accessTime, '%Y-%m-%d %k:%i:%s') AS 'アクセスタイム'
, DATE_FORMAT(stopTime, '%Y-%m-%d %k:%i:%s') AS 'ストップタイム'
FROM
access_logs
ORDER BY
stopTime
DESC
LIMIT
10
;
ーーー
問題: 3
TODO
access_logsのテーブルからデータを取得
カラムは「都道府県」「参加人数の合計」を準備
都道府県ごとの参加人数を集計
参加人数が500人以上の都道府県を表示
都道府県がnullのレコードを判定
→not havingみたいなことができるのか調べる
都道府県がnullの場合は表示しない
SELECT
prefecture
, SUM(participants_number) AS '参加人数の合計'
FROM
access_logs
GROUP BY
prefecture
HAVING
SUM(participants_number) >= 500
AND
prefecture IS NOT null
;
ーーー
問題: 4
TODO
access_logsとuser_listsのテーブルからデータを取得
取得したデータを1つのテーブルにする
・アクセスしてきた人のID/PWを表示: access_logsを主軸にする
=>内部結合or外部結合: 多分外部結合のleft joinを使う??
=>何を基準に結合?: user_list_id
表示するカラムは「ログインID」「パスワード」
access_logs.accessTimeが「2023年1月27日の19:15~19:30」のログを絞る
access_logs.hostIPが「142.53.10.72」のログを絞る
access_logs.userAgentが「Firefox」であるログを絞る
絞った結果を表示する
SELECT
userID
, userPassword
FROM
access_logs
LEFT JOIN
user_lists
ON
access_logs.user_list_id = user_lists.user_list_id
WHERE
access_logs.hostIP = '142.53.10.72'
;
ーーーメモーーー
user_listsのテーブルからデータを取得
カラムは「ログインID」「パスワード」を表示
access_logsのテーブルからデータを取得
access_logs.accessTimeが「2023年1月27日の19:15~19:30」のログを取得
access_logs.hostIPが「142.53.10.72」であるログを取得
access_logs.userAgentが「Firefox」であるログを取得
SELECT
userID
, userPassword
FROM
user_lists
;
ーーーーーーーー
# ActiveRecord
TODO:
1. ActiveRecordの条件文の記載方法を調べる
2. conferenceInfoIdが25を取得する
3. 全表示
ConferenceInfo.where(conferenceInfoId: 25)
TODO:
1. ActiveRecordの先頭のレコードを取得する文を調べる
2. 先頭のレコードを取得する
3. 実行
ConferenceInfo.first
TODO:
1. ActiveRecordの最後のレコードを取得する文を調べる
2. 最後のレコードを取得する
3. 実行
ConferenceInfo.last
TODO:
1. 問2を引用
ConferenceInfo.where(confName: 'テスト21講演会')
TODO:
1. ActiveRecordの先頭10個のレコードを取得する文を調べる
2. 先頭10個のレコードを取得する
3. 実行
imit(10)
TODO:
1. ActiveRecordの先頭からn番目以降のレコードを取得する文を調べる
2. 先頭から1901番目以降のレコードを取得する
3. 実行
AccessLog.offset(1901)
TODO:
1. ActiveRecordのカラムを絞り込む文を調べる
2. カラムをアクセスログID、都道府県、 施設、 氏名で絞り込んでレコードを取得する
3. 実行
AccessLog.select('accessLogId', 'prefecture', 'facility', 'name')
AccessLog.select(:accessLogId, :prefecture, :facility, :name)
TODO:
1. Q6とQ7の回答を参考にする
2. ActiveRecordの複数条件の書き方を調べる
3. 実行
AccessLog.limit(10).offset(1900)
TODO:
1. レコード数を数えるコードを調べる
2. 実行
AccessLog.count
TODO:
1. 集合視聴人数の平均をだすコードを調べる
3. 実行
User.where(first_name: "Nick").average(:salary)
AccessLog.average(:participants_number)
TODO:
1. 集合視聴人数の最大人数をだすコードを調べる
2. 実行
AccessLog.maximum(:participants_number)
TODO:
1. 集合視聴人数の最小人数をだすコードを調べる
2. 実行
AccessLog.minimum(:participants_number)
TODO:
1. 集合視聴人数の合計をだすコードを調べる
2. 実行
AccessLog.sum(:participants_number)
TODO:
1. 入室時間が早い順をだすコードを調べる
2. 実行
AccessLog.order(accessTime: :asc)
AccessLog.order(:accessTime)
TODO:
1. 入室時間が遅い順をだすコードを調べる
2. 実行
AccessLog.order(accessTime: :desc)
TODO:
1. データをランダムに1件のみ表示するコードを調べる
2. 実行
AccessLog.where( 'accessLogId >= ?', rand(AccessLog.first.accessLogId..AccessLog.last.accessLogId) ).first
AccessLog.order("RAND()").first
AccessLog.offset( rand(AccessLog.count) ).first
pry(main)> SomeModel.where( 'id >= ?', rand(SomeModel.first.id..SomeModel.last.id) ).first
SomeModel Load (0.7ms) SELECT `some_models`.* FROM `some_models` ORDER BY `some_models`.`id` ASC LIMIT 1
SomeModel Load (0.7ms) SELECT `some_models`.* FROM `some_models` ORDER BY `some_models`.`id` DESC LIMIT 1
SomeModel Load (1.0ms) SELECT `some_models`.* FROM `some_models` WHERE (id >= 130274) ORDER BY `some_models`.`id` ASC LIMIT 1
pry(main)> SomeModel.offset( rand(SomeModel.count) ).first
(359.7ms) SELECT COUNT(*) FROM `some_models`
SomeModel Load (1049.8ms) SELECT `some_models`.* FROM `some_models` ORDER BY `some_models`.`id` ASC LIMIT 1 OFFSET 404754
pry(main)> SomeModel.all.sample
SomeModel Load (2057.1ms) SELECT `some_models`.* FROM `some_models`
pry(main)> SomeModel.order("RAND()").first
SomeModel Load (3270.1ms) SELECT `some_models`.* FROM `some_models` ORDER BY RAND() LIMIT 1
ーーーーーーーーーー
READ文③
TODO:
1. テーブルのレコードを絞り込む条件を調べる
2. 実行
AccessLog.where(prefecture: '佐賀県')
TODO:
1. テーブルのレコード複数条件で絞り込む方法を調べる
2. 実行
AccessLog.where(prefecture: '福岡県').where(facility: '柳沢病院')
TODO:
1. テーブルのレコード複数条件(or)で絞り込む方法を調べる
2. 実行
AccessLog.where(facility: '松野病院').or(AccessLog.where(facility: '千田病院'))
TODO:
1. レコード数を数える方法と空ではない条件文を調べる
2. 実行
AccessLog.where.not(uid: "").count
TODO:
1. 範囲指定の条件文・降順の書き方を調べる
2. 実行
AccessLog.where(user_list_id: 18..20).order(:user_list_id)
TODO:
1. 部分一致の条件文の書き方を調べる
2. 実行
AccessLog.where('userAgent like ? ','%firefox%')
TODO:
1. 以上の条件文の書き方を調べる
2. 実行
AccessLog.where('participants_number => ? ',25)
TODO:
1. IPアドレスで検索する
2. 表示するカラムを指定する
3. 実行
AccessLog.select(:accessLogId, :prefecture, :facility, :name ,:hostIP).where(hostIP: '2.181.230.81')
―――
④-問題2
TODO:
1. グループ化する方法を調べる
2. 集合視聴人数をsumで集計する
3. 合計人数が500人以上のレコードを表示
4. 都道府県がnullのレコードは非表示
5. 表示するカラムは都道府県名と集計人数
6. 実行
AccessLog.having("sum(participants_number) >= 500").group(:prefecture).where.not(prefecture: nil).select(:prefecture, 'sum(participants_number) as participants_sum')
AccessLog.having("sum(participants_number) as participants_sum >= 500").group(:prefecture).where.not(prefecture: nil).select(:prefecture, 'participants_sum')
TODO:
1. 講演会名(conference_info_idが29)を絞り込む
2. IPアドレスでグループ化してカウントする
3. Firefoxを含まないものを取得
4. entryページの中に「live」を含むものを取得
5. 実行
AccessLog.where(conference_info_id: 29).where.not('userAgent like ?', '%Firefox%').where('entryPage like ?', '%live%').group(:hostIP).count(:hostIP)
AccessLog.where(conference_info_id: 29).where.not('userAgent like ?', '%Firefox%').where('entryPage like ?', '%live%').count
TODO:
1. whereでaccess_log_idが46を指定してしまう
2. 終わり
---
EnqueteAnswer.where(access_log_id: '46')
TODO:
1. カンファレンスインフォIDが39のカンファレンスインフォID、講演会名、講演会日時を表示
2.カンファレンスインフォID「39」に紐づいているアクセスログテーブルから都道府県、施設、氏名を表示
3.
ConferenceInfo.where(conferenceInfoId: '39').select(:conferenceInfoId, :confName, :conferenceDate)
ConferenceInfo.find(39).access_log
.select(:conferenceInfoId, :confName, :conferenceDate)
posts = User.posts.eager_load(:comments)
ConferenceInfo.joins(:access_log).where(conferenceInfoId: '39').select(:conferenceInfoId,:confName,:conferenceDate,:prefecture,:facility,:name)
conf = 10
name = 'ABC'
Table.where(conf: conf, name: name)
↓
Table.where(conf: , name: )
TODO:
1. アクセスログテーブルとアンケートログテーブルが親子関係なのか調べる
2. アクセスログテーブルとアンケートログテーブルを結合する
3. カンファレンスインフォIDが3のレコードを取得
4. カラムを絞る
⇒アクセスログID、都道府県、氏名、アンケートログテーブルの問1の答え、問2の答え
5. アンケートログテーブルにデータがないものは除外する
AccessLog.joins(:enquete_answer).where(conference_info_id: 3).select(:accessLogId, :prefecture, :name, :answer1, :answer2)
TODO:
1. カンファレンスインフォテーブルの講演会名「テスト14講演会」のデータを出力
2. カンファレンスインフォテーブルに紐づいているユーザーIDリストテーブルのデータも出力
3. カンファレンスインフォテーブルのカラムは全て表示、ユーザーIDリストテーブルのカラムはログインIDとパスワードのみ表示
4. SQLのクエリ回数を減らすために今回の取得したテーブルはキャッシュしておく
5. 実行
ConferenceInfo.left_outer_joins(:access_log)
.where(conferenceInfoId: 39)
.select(
:conferenceInfoId,
:confName,
:conferenceDate,
:prefecture,
:facility,
:name
)
ConferenceInfo.left_outer_joins(:user_list)
.where(confName: 'テスト14講演会')
.select(
:conferenceInfoId,
:confName,
:conferenceDate,
:created_at,
:updated_at,
:userID,
:userPassword
)
UserList.eager_load(:conference_info)
.where(conference_infos: {confName: 'テスト14講演会'})
.select(
'conference_infos. *',
'user_lists.userID',
'user_lists.userPassword'
)
TODO:
1. カンファレンスインフォテーブルのカンファレンスインフォID「47」のカンファレンスインフォID、講演会名、講演会日時を表示
2. カンファレンスインフォID「47」に紐づいているアクセスログテーブルから都道府県、施設、氏名を表示
3. カンファレンスインフォID「47」に紐づいているユーザーIDリストからログインIDとパスワードを表示
ConferenceInfo.left_outer_joins(:user_list)
.where(conference_infos: {confName: 'テスト14講演会'})
.select(
'conference_infos. *',
'user_lists.userID',
'user_lists.userPassword'
)
ConferenceInfo.left_outer_joins(:user_list)
.left_outer_joins(:access_log)
.where(conferenceInfoId: 47)
.select(
:conferenceInfoId,
:confName,
:conferenceDate,
:prefecture,
:facility,
:name,
:userID,
:userPassword
)
TODO:
1. カンファレンスインフォテーブルのカンファレンスインフォID「21」のカンファレンスインフォID、講演会名、講演会日時を表示
2. カンファレンスインフォID「21」に紐づいているアクセスログテーブルから都道府県、施設、氏名を表示
3. アクセスログテーブルのに紐づいているアンケートログテーブルから問1の答えと問2の答えを表示
ConferenceInfo.left_outer_joins(:enquete_answer, :access_log)
.where(conferenceInfoId: 21)
.select(
:conferenceInfoId,
:confName,
:conferenceDate,
:prefecture,
:facility,
:name,
:answer1,
:answer2
)
----------------------------------------------
READ文⑥
TODO:
1. アクセスログの2023年2月6日の14:00~14:15の間にアクセスされた、IP(202.237.113.26)でChromeを使って視聴している方のログインIDとパスワードを表示
2. カラムはアクセスログIDとログインIDとパスワードを表示
AccessLog.left_outer_joins(:user_list)
.where(hostIP: '202.237.113.26')
.where('userAgent like ?', '%Chrome%')
.where(accessTime: '2023-02-06 14:00'..'2023-02-06 14:15')
.select(
:accessLogId,
:userID,
:userPassword
)
---
⑥-問題2
TODO:
1. 講演会ごとの視聴者数の合計を出す
2. 講演会の視聴者数ランキングを1位(降順)から表示
3. カラムは講演会IDと視聴者数合計値を出力
ConferenceInfo.left_outer_joins(:access_log)
.group(:conference_info_id)
.sum(:participants_number)
.order(participants_number: :DESC)
.select(:conference_info_id, :participants_number)
【答え】
ConferenceInfo.left_outer_joins(:access_log)
.group(:conferenceInfoId)
.order("sum(participants_number) desc")
.select(:conferenceInfoId, "sum(participants_number)")
⑥-問題3
TODO:
1. 問題2の回答を流用
2. 講演会の視聴者数ランキング1位だけに絞る
3. ランキング1位のIDを持つアクセスログを全て表示
答え
AccessLog.where(conference_info_id:ConferenceInfo.joins(:access_log)
.group(:conferenceInfoId)
.order('SUM(participants_number) DESC')
.first)
ConferenceInfo.left_outer_joins(:access_log)
.group(:conferenceInfoId)
.order("sum(participants_number) desc")
.limit(1)
AccessLog.left_outer_joins(:conference_info)
.group(:conferenceInfoId)
.order("sum(participants_number) desc")
.limit(1)
AccessLog.where(conference_info_id: ConferenceInfo.left_outer_joins(:access_log).group(:conferenceInfoId).order("sum(participants_number) desc").limit(1))
---
6-4
以下の条件を満たすActiveRecordの文を記載しなさい
・入室時間が「2023-02-08」でライブ配信のアクセスログを表示
・参加登録の都道府県がnullの物は表示しない
・参加登録の都道府県ごとに見たとき、アンケートログの問1の答えが「1」と回答された数が「2」以上の都道府県を表示
・カラムはアクセスログテーブルの「アクセスログID(nullでok)」「都道府県」とアンケートログテーブルの
「都道府県ごとの問1の答えの数」を表示
TODO
1.入室時間が「2023-02-08」でライブ配信のアクセスログを表示
2.参加登録の都道府県がnullの物は表示しない
3.参加登録の都道府県ごとに見たとき、アンケートログの問1の答えが「1」と回答された数が「2」以上の都道府県を表示
4.カラムはアクセスログテーブルの「アクセスログID(nullでok)」「都道府県」とアンケートログテーブルの「都道府県ごとの問1の答えの数」を表示
AccessLog.joins(:enquete_answer)
.where('entryPage like ?', '%live%')
.where('accessTime like ?', '%2023-02-08%')
.where.not(prefecture: nil)
.group(:prefecture)
.having("count(answer1 = 1) >= 2")
.select(:prefecture,"count(answer1 = 1")
AccessLog.joins(:enquete_answer)
.where('entryPage like ?', '%live%')
.where('accessTime like ?', '%2023-02-08%')
.where.not(prefecture: nil)
.group(:prefecture)
.having("count(enquete_answers.answer1 = 1) >= 2")
.select(:prefecture,"count(answer1)")
---
TODO:
1. recordを追加する方法を調べる
2. 講演会名を問題に沿って設定してrecordを追加
3. 実行
SqlPlacticeLog.create({ conf_name: "御厨篤講演会", created_by: "チームA" })
---
TODO:
1. recordを更新する方法を調べる
2. 講演会情報を問題に沿って設定してrecordを更新
3. 実行
SqlPlacticeLog.find(92).update(conf_info: "てきとうな文w")
---
TODO:
1. 現在時刻を取得する方法を調べる
2. 講演会日と講演時間を設定してレコード追加
3. 実行
SqlPlacticeLog.create({ created_by: "チームA", conf_date:Date.today, conf_time:Time.now})
SqlPlacticeLog.create({ created_by: "チームA", conf_date:Date.tomorrow, conf_time:Time.now.tomorrow })
---
TODO:
1. これまで作成したデータ(自分のチームのもの)で講演会日が本日であれば、そのデータの本日講演をtrueと入力する
SqlPlacticeLog.where(created_by: "チームA")
.where(conf_date:Time.now