Php 使用MySQL创建新闻流量,根据提供表名和ID的表从3个表中进行选择

Php 使用MySQL创建新闻流量,根据提供表名和ID的表从3个表中进行选择,php,mysql,select,join,Php,Mysql,Select,Join,我正在尝试用MySQL创建一个新闻流量。。。为此,我有一个表“action”,它记录在其他三个表(“article”、“commentaire”、“auteur”)中的任何一个表中进行插入或更新的时间。现在,我在第一个表“action”中有4列: id_动作(允许按顺序知道何时采取动作) 操作(添加/更新) 表(其他三个表之一的名称) id_表(上表中对应的id) 其他3个表有不同的列名称和内容,因此,我有: 表'article'中的'id','titre','contenu','cate

我正在尝试用MySQL创建一个新闻流量。。。为此,我有一个表“action”,它记录在其他三个表(“article”、“commentaire”、“auteur”)中的任何一个表中进行插入或更新的时间。现在,我在第一个表“action”中有4列:

  • id_动作(允许按顺序知道何时采取动作)
  • 操作(添加/更新)
  • 表(其他三个表之一的名称)
  • id_表(上表中对应的id)
其他3个表有不同的列名称和内容,因此,我有:

  • 表'article'中的'id','titre','contenu','categorie'列
  • 表“commentaire”中包含列“id”、“contenu”
  • 带有“id”、“prenom”、“presentation”、“Localization”列的表“AUTUR”
我尝试过以下连接:

SELECT ar.*,co.*,au.*
FROM 'action' AS ac
LEFT JOIN ac.table AS tbl ON ac.id_table = tbl.id
。。。但它没有给出任何信息,因为“ac.table”表不存在。。。(事实上,我希望它可能会采用表的名称,并在JOIN中替换它…:p

因此,在2-3次试验没有成功后,我终于找到了一些有效的方法,但后者非常耗时且缓慢,我正在寻找更好的解决方案。。。 我找到的解决方案由4个功能组成:

function showAllAction(){
   $preprequete = "SELECT id_table, table
   FROM 'action'";

   $requete = $this->pdo->prepare($preprequete);
   if ($requete->execute()) {
       $result = $requete->fetchAll(PDO::FETCH_ASSOC);
       $requete->closeCursor();
       return $result;
   }else{ die(print_r($requete->errorInfo()));} 
   return false;
}
接着是一个foreach

$actions = $this->showAllAction();
foreach ($actions as $value){
   if($value['table']=='article'){
      $article = $this->showArticle($value['id_table']);
      echo $article['titre'];
   }elseif($value['table']=='commentaire'){
      $commentaire = $this->showCommentaire($value['id_table']);
      echo $commentaire['contenu'];
   }else{
      $auteur = $this->showAuteur($value['id_table']);
      echo $auteur['prenom'];
   }
}
其中différentes函数是简单的SELECT(以下代码仅用于说明,我已经删除了所有不需要的内容):


这一点,如果任何人有更有效的方法来做需要的事情,欢迎所有答案!加入,条件,我不知道什么可以做到这一点…

我不完全清楚您在这里试图实现什么-这是某种审计跟踪吗?我真的建议您避免这种表结构,您会遇到很大的性能问题数据集变大时出现问题。请尝试在每个数据表中使用一个“历史记录”表,例如
article\u actions
comment\u actions

在任何情况下,这里的查询都将执行与您正在执行的操作大致相同的操作,但在纯SQL中,当您保存所有数据库往返时,它应该会更快(但我仍然不建议您使用此操作表):


完整示例在每个表上粘贴两列
datetime
,一列用于
creation\u time
,另一列用于
update\u time
。请参见[此链接][http://twopieceset.blogspot.com.au/2007/12/best-practices-5-ws-of-database-design.html]以获取更详细的解释

您可以创建视图以简化按时间顺序查找,例如:

create or replace view recent_updates as 
select 'article' as `table`, article_id from article 
where update_time > now() - interval 1 day 
union all
select 'comment' as `table`, comment_id from comment 
where update_time > now() - interval 1 day 
union all
...
order by update_time desc
limit 1000
;
即使您的数据库在增长,这也将保持快速,并且不需要单独的跟踪表。不要忘记为时间列编制索引


(注意:添加了一个新答案,因为这不适合评论)

非常感谢你的回答!事实上,我想做的是像报纸一样,但在一个网站上,人们可以更新他们的档案、添加文章、评论文章,我试图创建一个网站,人们不需要浪费时间去寻找所有的变化,但可以在“新闻”页面上找到过去24小时内的所有变化,例如……我正在尝试所有的c变更应按时间顺序进行,而不是按活动进行(档案更新、评论添加、文章添加等)这就是为什么每个数据表都有一个“历史”表不起作用的原因,我想是因为信息不会按时间顺序给出…?这很有趣!我没有想到为创建和更新创建列,只是为了创建,但更新列可能会有帮助,在我的选择中,我在示例中添加了一个条件,如果更新为null,则日期为上次移动=创建数据,else date\u last\u move=更新数据并根据需要工作!:)非常感谢您的帮助!:)
select ac.`table`, ar.title
from action ac join article ar on ac.table_id = ar.article_id
where `table` = 'article'
union all
select ac.`table`, co.content
from action ac join comment co on ac.table_id = co.comment_id
where `table` = 'comment'
union all
select ac.`table`, au.name
from action ac join author au on ac.table_id = au.author_id
where `table` = 'author'
;
create or replace view recent_updates as 
select 'article' as `table`, article_id from article 
where update_time > now() - interval 1 day 
union all
select 'comment' as `table`, comment_id from comment 
where update_time > now() - interval 1 day 
union all
...
order by update_time desc
limit 1000
;