结合两个MySql数据库,按日期排序,但具有不同的格式

时间:2012-03-28 05:50:51

标签: php mysql

好的,在我开始之前,我必须告诉你,我要问的是非常具体而且非常难以解释,所以我将尽我最大努力使其明确和尽可能简单。谢谢。


问题:

我有两个表有两个完全不同的模式,一个名为 mixtapes ,另一个名为 blabbing 。我希望能够将两个表组合成一个fetch,按日期排序,但用完全不同的格式回显它们。

想象一下它是facebook的模拟信息。如果所有内容都在不同的数据库中(图像更改,帖子,链接帖子等),则所有内容都按日期排序(如果选择了选项),但它们都在不同的数据库中。

我想坚持使用mysql fetch数组的格式化:

$sqlLatestActivity = mysql_query("SELECT * FROM mixtapes WHERE posted_by_id
  IN ($array_of_subscribing);");

while($row = mysql_fetch_array($sqlLatestActivity)){ 
    $id = $row["id"];
    $title = $row["title"];
    $description = $row["description"];
    $keywords = $row["keywords"];
    $date = strtotime($row["date"]);
    $posted_by_id = $row["posted_by_id"];}


我想从两个表,mixtapes和amp;中获取数据。诽谤并将其组合成15个最新(按日期)的结果,但格式不同,例如:

如果结果(15个中的一个)来自mixtapes,它应该像这样形成:

$the_variable_echoing .= 
 '<div>'  . $posted_by_id . ' Just Added a Mixtape. To listen To it, go
 <a href="/THEMIXTAPE.php">here</a></div>';

但是,如果它是一个blab而结果来自blabbing,那么它的格式应该是这样的:

$the_variable_echoing .= '<div>' . $the_blab . '<br />
 Posted: ' . $blab_date . '</div>';


在我的身体里,我要补充一下:

<?php echo $the_variable_echoing; ?>

表格信息


关于: blabbing ;

id (PRIMARY)
Idofpage
poster_id (发布blab的用户的ID)
日期
the_blab
blab_type
设备

about: mixtapes ;

id (PRIMARY)
标题
if_featured
评级
流派
持续时间
number_of_tracks
说明
关键字
日期
posted_by_id
twitter_tags

1 个答案:

答案 0 :(得分:2)

使用UNION查询和明智数量的 filler 列(您没有指定每个表中需要哪些列,所以我只是在这里猜测)。为了支持WHERE条件,我还要将其作为一个视图,例如

CREATE VIEW `feed` AS
SELECT
    id,
    title,
    description,
    keywords,
    `date`,
    posted_by_id,
    'mixtape' AS `type`
FROM mixtapes
UNION ALL
SELECT
    id,
    the_blab AS title, 
    device AS description, -- use device in the description column
    null AS keywords, -- this will be blank
    `date`,
    poster_id AS posted_by_id,
    'blab' AS `type`
FROM blabbing;

然后SELECT使用

SELECT * FROM `feed` WHERE `posted_by_id` IN (?, ?, ?)
ORDER BY `date` DESC
LIMIT 15

您只需要确保两个合并的SELECT语句具有匹配的列号和类型。

结果集中的每一行都会有一个type列,其中包含mixtapeblab值,因此您可以确定它来自哪个表。

渲染示例(PDO,使用它!)

$stmt = $pdo->prepare('SELECT * FROM `feed` ORDER BY `date` DESC LIMIT 15');
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) : ?>
    <div>
    <?php if ($row['type'] == 'mixtape') : ?>
        <?php echo htmlspecialchars($row['posted_by_id'], ENT_QUOTES, 'UTF-8') ?>
        Just Added a Mixtape. To listen To it, go
        <a href="/THEMIXTAPE.php">here</a>
    <?php elseif ($row['type'] == 'blab') : ?>
        <!-- echo title as this is the the_blab alias in the view -->
        <?php echo htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8') ?>
        <br />
        Posted: <?php echo htmlspecialchars($row['date'], ENT_QUOTES, 'UTF-8') ?>
    <?php endif ?>
    </div>
<?php endwhile ?>

作为涉及更多查询的考虑因素(但是,嘿,它总共只有15条记录)。我可能只是喜欢这样的东西

SELECT `id`, `date`, 'mixtape' AS `type` FROM mixtapes
UNION ALL
SELECT `id`, `date`, 'blab' AS `type` FROM blabbing
ORDER BY `date` DESC
LIMIT 15

现在,您拥有两个表中最新十五个条目的id和source表。当您迭代结果集时,我只需通过ID查询相应的表,以获取该记录的完整数据集。如果适当的缓存,这应该表现得相当好,并且更容易理解。

您可能还会考虑使用非关系数据库(Mongo,CouchDB等),因为它可能更适合该任务。