Php 使用MySQL创建新闻流量,根据提供表名和ID的表从3个表中进行选择
我正在尝试用MySQL创建一个新闻流量。。。为此,我有一个表“action”,它记录在其他三个表(“article”、“commentaire”、“auteur”)中的任何一个表中进行插入或更新的时间。现在,我在第一个表“action”中有4列: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
- id_动作(允许按顺序知道何时采取动作)
- 操作(添加/更新)
- 表(其他三个表之一的名称)
- id_表(上表中对应的id)
- 表'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
;