PHP和MySQL:将不同表中的行排列在一起,并使用表达式确定行的来源

PHP和MySQL:将不同表中的行排列在一起,并使用表达式确定行的来源,php,database,function,conditional,Php,Database,Function,Conditional,我需要从两个单独的表中提取行,并按日期降序排列。这些行不按顺序或编号对应,并且彼此之间没有关系 它们每个都包含一个站点的更新,一个表包含来自博客的文本、链接、日期、标题等。另一个有来自图像的标题、链接、规格等。我想安排一些基本信息(标题,日期,小说明)在网站主页上的更新部分,并为它是在日期的顺序 将它们合并到一个表中并对其进行修改以适应这两种类型并不是我在这里想要做的,blog表是“标准wp_posts”,我不喜欢添加列以使其适应image表。我担心这可能会与以后的升级冲突,这似乎是一个笨拙的解

我需要从两个单独的表中提取行,并按日期降序排列。这些行不按顺序或编号对应,并且彼此之间没有关系

它们每个都包含一个站点的更新,一个表包含来自博客的文本、链接、日期、标题等。另一个有来自图像的标题、链接、规格等。我想安排一些基本信息(标题,日期,小说明)在网站主页上的更新部分,并为它是在日期的顺序

将它们合并到一个表中并对其进行修改以适应这两种类型并不是我在这里想要做的,blog表是“标准wp_posts”,我不喜欢添加列以使其适应image表。我担心这可能会与以后的升级冲突,这似乎是一个笨拙的解决方案(但这并不意味着如果这里的人建议我这是最好的解决方案,我会反对)

以下是各表的说明:

mysql> describe images;
+---------+--------------+------+-----+-------------------+----------------+
| Field   | Type         | Null | Key | Default           | Extra          |
+---------+--------------+------+-----+-------------------+----------------+
| id      | int(11)      | NO   | PRI | NULL              | auto_increment |
| project | varchar(255) | NO   |     | NULL              |                |
| title   | varchar(255) | NO   |     | NULL              |                |
| time    | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
| img_url | varchar(255) | NO   |     | NULL              |                |
| alt_txt | varchar(255) | YES  |     | NULL              |                |
| text    | text         | YES  |     | NULL              |                |
| text_id | int(11)      | YES  |     | NULL              |                |
+---------+--------------+------+-----+-------------------+----------------+

mysql> DESCRIBE wp_posts;
+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field                 | Type                | Null | Key | Default             | Extra          |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint(20) unsigned | NO   |     | 0                   |                |
| post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_date_gmt         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content          | longtext            | NO   |     | NULL                |                |
| post_title            | text                | NO   |     | NULL                |                |
| post_excerpt          | text                | NO   |     | NULL                |                |
| post_status           | varchar(20)         | NO   |     | publish             |                |
| comment_status        | varchar(20)         | NO   |     | open                |                |
| ping_status           | varchar(20)         | NO   |     | open                |                |
| post_password         | varchar(20)         | NO   |     |                     |                |
| post_name             | varchar(200)        | NO   | MUL |                     |                |
| to_ping               | text                | NO   |     | NULL                |                |
| pinged                | text                | NO   |     | NULL                |                |
| post_modified         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_modified_gmt     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content_filtered | text                | NO   |     | NULL                |                |
| post_parent           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| guid                  | varchar(255)        | NO   |     |                     |                |
| menu_order            | int(11)             | NO   |     | 0                   |                |
| post_type             | varchar(20)         | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)        | NO   |     |                     |                |
| comment_count         | bigint(20)          | NO   |     | 0                   |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+
我可以很容易地用这样一个表来实现这一点(我在这里包括它,以防我在不知情的情况下使用了过于复杂的方法):

但是,如何将两个表调用到同一个数组中以正确排列它们呢

正确地说,我的意思是,他们将根据他们的日期混合他们的回声结果。也许我从错误的角度来看这个问题,将它们调用到单个数组不是答案吗

此外,我需要一种基于它们来自哪个表来形成条件表达式的方法,以便表1中的行与表2中的行得到不同的响应

我希望表1中的结果得到不同的响应(我的意思是,在它们周围连接不同的字符串),以便与表2中的结果进行不同的样式设置。反之亦然

我知道if…else语句可以在这里使用,但我不知道如何编写表达式来确定行来自哪个表。

使用:

while($row = mysql_fetch_array($content)) 
{ 
    $key = $row['post_date'].'-'.$row['id'];
    $array[$key] = array("table"=>1, "row"=$row);
} 

一旦处理完这两个表,就使用
κsort($array)

也许SQL联合是有用的

SELECT * FROM (
    SELECT post_title, post_text, post_date, 'posts1' AS is_from FROM posts1
    UNION
    SELECT post_title, post_text, post_date, 'posts2' AS is_from FROM posts2 
) AS posts1_posts2 ORDER BY post_date DESC

基于PHP的排序选项并不总是最好的选择,因为您可能希望对结果进行分页,在这一点上您会遇到困难

上面描述的基于联合的查询将更好地工作,但您需要调整它以允许表的不同模式:

(
  Select 'Image' as data_type, id, title, time as date_posted, ....
  From images
)
UNION
(
  Select 'Post', ID as id, post_title as title, post_date as date_posted, ...
  From wd_posts
)
Order By date_posted Desc Limit $foo, $bar
关键是您应该从两个表中提取相同数量的列。列名不一定要相同才能工作,但我已经在上面做了相同的设置

我还认为你应该在images.time和wd_posts.post_date上设置索引


按时间(timestamp)和post_date(datetime)字段的混合格式排序在MySQL 5上可以使用,我刚刚尝试过。

表之间的关系是什么?你能描述一下它们的结构吗?它们有相同的字段吗?暂且不说,为什么,你希望它们如何合并?如果您可以发布相关表的描述,请提供示例数据和有帮助的预期输出。我们必须看到descripe子句的输出。如果这两个表通过某列相互关联,则可以将它们联接起来,然后对结果进行排序。无论如何,使用PHP对结果进行排序也是可能的。
(
  Select 'Image' as data_type, id, title, time as date_posted, ....
  From images
)
UNION
(
  Select 'Post', ID as id, post_title as title, post_date as date_posted, ...
  From wd_posts
)
Order By date_posted Desc Limit $foo, $bar