2010-03-10 5 views
2

J'ai besoin de prendre des lignes à partir de deux tables distinctes, et les organiser dans l'ordre décroissant par leur date. Les lignes ne correspondent pas dans l'ordre ou le nombre et n'ont aucune relation entre elles.PHP et MySQL: Organiser des lignes à partir de tables séparées et l'expression pour déterminer l'origine de la ligne

Ils contiennent chacun des mises à jour sur un site, une table contient du texte, des liens, des dates, des titres, etc. à partir d'un blog. L'autre a des titres, des liens, des spécifications, etc. à partir d'images. Je veux organiser quelques informations de base (titre, date, petite description) dans une section mises à jour sur la page principale du site, et pour qu'il soit dans l'ordre de date.

En les fusionnant dans une table et en les modifiant pour convenir aux deux types n'est pas ce que je voudrais faire ici, la table de blog est WordPress 'standard wp_posts, et je ne me sens pas à l'aise d'ajouter des colonnes la table d'image aussi. Je crains que cela ne puisse entrer en conflit avec la mise à niveau plus tard et que cela semble être une solution maladroite (mais cela ne signifie pas que j'objecterai si les gens ici me disent que c'est la meilleure solution).

Voici les DÉCRIT de chaque table:

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

je peux le faire facilement avec une seule table comme celui-ci (j'inclus ici au cas où j'utilise une méthode trop complexe sans le savoir) :

$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']; 
} 

Mais comment est-il possible d'appeler les deux tables dans le même tableau pour les organiser correctement?

Par correctement, je veux dire qu'ils vont mélanger leurs résultats écho en fonction de leur date. Peut-être que je regarde cela du mauvais point de vue, et les appeler à un seul tableau n'est pas la réponse?

En outre, j'ai besoin d'un moyen de former une expression conditionnelle basée sur la table d'où ils viennent, de sorte que les lignes de la table 1 soient traitées différemment des lignes de la table 2? Je souhaite que les résultats de la table 1 soient répercutés différemment (avec différentes chaînes concaténées autour d'eux, je veux dire) dans le but de les styliser différemment de ceux de la table 2. Et vice versa.

Je sais qu'une instruction if...else fonctionnerait ici, mais je n'ai aucune idée de la façon dont je peux écrire l'expression qui permettrait de déterminer de quelle table provient la rangée.

+0

Quelle est la relation entre les tables? Pouvez-vous décrire leur structure, ont-ils les mêmes champs? Comment - en laissant de côté, pour le moment, * pourquoi * - voulez-vous qu'ils soient fusionnés? Si vous pouviez publier les descriptions des tables pertinentes, donnez des exemples de données et un résultat attendu qui vous aiderait. –

+0

Nous devons voir une sortie d'une clause DESCRIBE. Si les deux tables sont liées entre elles par une colonne, vous pouvez les joindre et, plus tard, classer les résultats. Quoi qu'il en soit, utiliser PHP pour commander les résultats est également possible. – Dor

Répondre

0

Les options de tri en PHP ne sont pas toujours la meilleure idée parce que vous pouvez paginer vos résultats, à quel point vous rencontrez des difficultés.

La requête basée sur UNION décrit ci-dessus fonctionnera mieux, mais vous aurez besoin de ruser pour permettre les différents schémas des tables:

(
    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 

La clé est que vous devez tirer le même nombre de colonnes des deux tables. Les noms des colonnes ne doivent pas forcément être identiques pour que cela fonctionne, mais je les ai fait pareil.

Je pense aussi que vous devriez mettre des index sur images.time et wd_posts.post_date.

L'ordre de formatage par les champs time (timestamp) et post_date (datetime) fonctionnera sur MySQL 5, je l'ai juste essayé.

+0

-1 pour copier mon message au lieu de le commenter ... – clyfe

0

Utilisation:

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

Utilisez кsort($array) une fois que vous avez fait avec les deux tables.

2

Peut-être un SQL UNION est utile

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