質問を見ていただき、ありがとうございます。
当方初心者になります。調べても解決しなかったため、質問させていただきました。
早速掲題の件ですが、下記にまとめます。
DB現状
- articleテーブル(お知らせ記事)
|-id
|-time
|-title
|-...etc
- newsテーブル(ニュース)
|-id
|-time
|-title
|-...etc
- blogテーブル(ブログ)
|-id
|-time
|-title
|-...etc
- logテーブル(更新履歴)
|-id
|-time
|-category
|-no
となっております。
元々はlogとarticleテーブルのみで
今回、news・blogテーブルを追加しました。
logテーブルは、各テーブルでトリガを設定していて
INSERTがあった時に、logテーブルに
自分のテーブル名をcategoryに、
自分のid番号をnoにINSERTするようにしています。
例えば、articleテーブルでのトリガは
MySQL
1INSERT INTO `log` (`time`, `category`, `no`) VALUES (NEW.time, "article", NEW.id)
のようにしています。
追記
Orlofsky様
トリガのコードを載せて見ます。
間違いがある場合、コメントいただけますと幸いです。
MySQL
1DELIMITER $$ 2 3CREATE TRIGGER `add_log` AFTER INSERT ON article FOR EACH ROW 4 BEGIN 5 INSERT INTO `log` (`time`, `category`, `no`) 6 VALUES (NEW.time, "article", NEW.id); 7 END; 8$$ 9 10DELIMITER ;
現状の更新履歴ページ
元々は、articleテーブルしか作成していなかったのでPHPで取得するときは
下記のようなクエリで取得していました。
MySQL
1SELECT 2 `log`.`time` AS `time`, 3 `log`.`category` AS `category`, 4 `article`.`title` AS `title` 5 6FROM 7 `log` 8 LEFT JOIN `article` ON `log`.`no` = `article`.`id` 9ORDER BY `log`.`time` DESC LIMIT 0, 3
このため、表示するときも簡単で
PHP
1while ($row = $info->fetch_assoc()) { 2 ここで表示をさせる(print($row['title']のような感じ) 3}
としておりました。
HPの出力結果は
カテゴリー | 時間 | タイトル |
---|---|---|
お知らせ | 2018−09−08 00:03 | あいうえお |
お知らせ | 2018−09−08 00:02 | かきくけこ |
お知らせ | 2018−09−08 00:01 | さしすせそ |
###問題・やりたいこと
ここから本題なのですが、テーブルが追加されたため
categoryが複数になるのでLEFT JOINの部分がどうなるのかわかりません。
logテーブルが
id | time | category | no |
---|---|---|---|
1 | 2018-09-07 00:01 | article | 5 |
2 | 2018-09-07 00:02 | news | 8 |
3 | 2018-09-07 00:03 | article | 6 |
4 | 2018-09-07 00:04 | blog | 3 |
のようになった時に、logテーブルのこの情報から
どうやってその先のarticleテーブルのid5番や
newsテーブルのid8番を取得して良いかわかりません。
HP出力結果は
カテゴリー | 時間 | タイトル |
---|---|---|
ブログ | 2018−09−08 00:04 | あいうえお |
お知らせ | 2018−09−08 00:03 | かきくけこ |
ニュース | 2018−09−08 00:02 | さしすせそ |
としたいのですが、うまくできません。
今までは、article限定だったのでよかったのですが、
複数になったときにLEFT JOIN ONの書き方が
わからなくなってしまいました。
そもそもLEFT JOINで良いのかもわかりません。
わかる方、ご教示いただけたらと思います。
何卒よろしくお願いいたします、
説明不足な箇所がございましたら、追記いたします。
お手数をおかけいたしますが、よろしくお願いいたします。
###追記
mts10806様
logテーブルの
category
は取得先のテーブル名
no
は取得先テーブルの重複のないidになります。
Orlofsky様
テーブル定義を書いて見ます。
書き方はあっているでしょうか?
お恥ずかしながら、ソフトを使ってしかDBをつくったことがなく
初めてCREATE TABLEを使います。
MySQL
1CREATE TABLE `article` 2 ( 3 `id` INT(11) NOT NULL, 4 `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 5 `title` TEXT NOT NULL 6 ); 7ALTER TABLE `article` ADD CONSTRAINT `pri` PRIMARY KEY (`id`); 8 9CREATE TABLE `news` 10 ( 11 `id` INT(11) NOT NULL, 12 `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 13 `title` TEXT NOT NULL 14 ); 15ALTER TABLE `news` ADD CONSTRAINT `pri` PRIMARY KEY (`id`); 16 17CREATE TABLE `blog` 18 ( 19 `id` INT(11) NOT NULL, 20 `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 21 `title` TEXT NOT NULL 22 ); 23ALTER TABLE `blog` ADD CONSTRAINT `pri` PRIMARY KEY (`id`); 24 25CREATE TABLE `log` 26 ( 27 `id` INT(11) NOT NULL, 28 `time` DATETIME NOT NULL, 29 `category` TEXT NOT NULL, 30 `no` INT(11) NOT NULL 31 ); 32ALTER TABLE `log` ADD CONSTRAINT `pri` PRIMARY KEY (`id`);
間違いや改善点がございましたらご指摘いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー