2つのテーブルを連結して記述するSQL

アクセスログを取る時に、userテーブルとlogのテーブルを連携してアクセスログを取得する必要があった。

かなりハマったのでメモ

前提としてuserテーブルのスキーマ

id int AUTO_INCREMENT
user_no varchar(10) utf8mb4_bin
password varchar(255) utf8mb4_bin
last_name varchar(255) utf8mb4_bin
first_name varchar(255) utf8mb4_bin
email varchar(255) utf8mb4_bin
comment text utf8mb4_binはいNULL
auth_type int

login_logのスキーマ

id int AUTO_INCREMENT
user_id int
login_time datetime CURRENT_TIMESTAMPDEFAULT_GENERATED
ip_address varchar(255) utf8mb4_bin
user_agent varchar(255) utf8mb4_bin

この内容からログインした人の名前と、ログインした日時、IPアドレスを取得する

$sql = "SELECT ll.*, u.last_name, u.first_name
        FROM login_log ll
        JOIN user u ON ll.user_id = u.id
        ORDER BY ll.login_time DESC
        LIMIT :limit OFFSET :offset";

FROM login_log llでlogin_logをllに改名⇒演算子に見えるため、ここで混乱した。(命名ミス)

SELECT ll.*としてlogin_logのカラム全てを取得

JOIN user uでuserをuに改名

SELECT u.last_name, u.first_nameとして2つのカラムを取得(姓・名)

ON ll.user_id = u.idとしてlogin_logのuser_idとuserのidを関連付ける⇒結合法則に従っているだけなので、プレースホルダーは不要と考える。

ORDER BY ll.login_time DESCは取得した情報をlogin_timeを軸として降順に並び替える。

とりあえず参考になれば幸いです。

フリーランス向け「お金と保険」のサービス【FREENANCE(フリーナンス)】

フリーランスの請求書を現金化【FREENANCE】

コメントを残す