我正在尝试使用 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/