PHP и MySQL: расположение строк из отдельных таблиц вместе и выражение для определения происхождения строки - PullRequest
2 голосов
/ 10 марта 2010

Мне нужно взять строки из двух отдельных таблиц и расположить их в порядке убывания по дате. Строки не соответствуют порядку или номеру и не связаны друг с другом.

Каждый из них содержит обновления на сайте, одна таблица содержит текст, ссылки, даты, заголовки и т. Д. Из блога. Другой имеет заголовки, ссылки, спецификации и т. Д. Из изображений. Я хочу разместить некоторую основную информацию (заголовок, дату, небольшое описание) в разделе обновлений на главной странице сайта, чтобы она располагалась в порядке даты.

Объединение их в одну таблицу и изменение ее в соответствии с обоими типами - это не то, что я хотел бы здесь сделать, таблица блога WordPress 'стандартная wp_posts, и мне неудобно добавлять столбцы, чтобы он соответствовал таблице изображений тоже. Боюсь, что позже это может привести к конфликту с обновлением, и это похоже на неуклюжее решение (но это не значит, что я буду возражать, если люди посоветуют мне, что это лучшее решение).

Вот ОПИСАНИЕ каждой таблицы:

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                   |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+

Я могу легко сделать это с помощью одной таблицы, как эта (я включаю ее здесь на случай, если я использую слишком сложный метод, не зная об этом):

$content = mysql_query("SELECT post_title, post_text, post_date FROM posts ORDER BY post_date DESC");
while($row = mysql_fetch_array($content))
{
    echo $row['post_date'], $row['post_title'], $row['post_text'];
}

Но как можно вызвать обе таблицы в один и тот же массив, чтобы правильно расположить их?

Правильно, я имею в виду, что они будут смешивать свои отраженные результаты, основываясь на их дате. Может быть, я смотрю на это с неправильной точки зрения, и вызов их в один массив не является ответом?

Кроме того, мне нужен способ сформировать условное выражение, основанное на том, из какой таблицы они получены, чтобы строки из таблицы 1 отображались не так, как строки из таблицы 2?

Я хочу, чтобы результаты из таблицы 1 отображались по-разному (я имею в виду различные строки, объединенные вокруг них) с целью их стилизации иначе, чем из таблицы два. И наоборот.

Я знаю, что здесь будет работать оператор if...else, но я понятия не имею, как мне написать выражение, которое определит, из какой таблицы получена строка.

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Может быть, SQL UNION полезен

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
0 голосов
/ 11 марта 2010

Варианты сортировки на основе PHP - не всегда лучшая идея, потому что вы можете разбить на страницы свои результаты, и в этот момент вы столкнетесь с трудностями.

Описанный выше запрос на основе UNION будет работать лучше, но вам необходимо настроить его, чтобы учесть различные схемы таблиц:

(
  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.

Упорядочение в смешанном формате по полям time (timestamp) и post_date (datetime) будет работать на MySQL 5, я только что попробовал.

0 голосов
/ 10 марта 2010

Использование:

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

Используйте кsort($array) после завершения работы с обеими таблицами.

...