php - 使用 MySQL 创建新闻通量,根据提供的表名和 ID 从 3 个表中选择

标签 php mysql select join

我正在尝试使用 MySQL 创建新闻通量... 为此,我有一个表“action”,它记录在其他 3 个表(“article”、“commentaire”)之一中插入或更新的任何时间','导演')。现在,我在第一个表“action”中有 4 列:

  • id_action(允许按顺序知道何时采取了行动)
  • 操作(添加/更新)
  • 表(其他 3 个表之一的名称)
  • id_table(上表对应id)

其他 3 个表具有不同的列名称和内容,因此,我有:

  • 包含列“id”、“titre”、“contenu”、“categorie”的表“article”
  • 包含“id”、“contenu”列的“commentaire”表
  • 包含“id”、“prenom”、“presentation”、“localisation”列的“auteur”表

我试过像这样的连接:

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(以下代码只是为了说明,我已经删除了所有不需要的东西以达到目的):

function showArticle($id_table){
   "SELECT titre, contenu, categorie
   FROM 'article'
   WHERE id = :id_table"
}
function showCommentaire($id_table){
   "SELECT contenu
   FROM 'commentaire'
   WHERE id = :id_table"
}
function showAuteur($id_table){
   "SELECT prenom, presentation, localisation
   FROM 'auteur'
   WHERE id = :id_table"
}

这个,如果有人有更有效的方法来做需要做的事情,欢迎所有答案! JOIN,条件语句,我不知道有什么办法...

最佳答案

在每个表上粘贴一对 datetime 列,一个用于 creation_time,一个用于 update_time。有关更详细的解释,请参阅[此链接][http://twopieceset.blogspot.com.au/2007/12/best-practices-5-ws-of-database-design.html]。

您可以创建一个 View 来简化按时间顺序查找,例如:

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
;

即使您的数据库在增长并且不需要单独的跟踪表,这也会保持快速。不要忘记为时间列编制索引!

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

关于php - 使用 MySQL 创建新闻通量,根据提供的表名和 ID 从 3 个表中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19876108/

相关文章:

php - Facebook 分享按钮显示错误图片

php - 显示来自 MySQL 的信息 - 来自 2 个不同的表...啊!菜鸟有麻烦了

php - 在 MySQL 中将 like 和 % 与列名一起使用

mysql - 从一个记录中选择两个登录

php - Twitter API - 实时收听用户的推文

php - 更新列数量

javascript - 时区被添加到 mysql DB 的时间中

php - 在mysql中首先对varchar整数进行排序

php - 如何在选择查询中使用多个表?(没有内部联接)

mysql - 有条件地选择 MySQL 中的字段或静态字符串