2010-11-20 4 views
0

J'utilise cette requête MySQL, appelée par MySQL:MySQL REJOIGNEZ: les chaînes ne pas retourner

SELECT tf_posts.*, tf_threads.thread_id FROM tf_threads LEFT JOIN tf_posts ON tf_threads.thread_id=54

Quand j'utilise mysql_fetch_array je reçois une gamme complète de chaque champ, mais les valeurs réelles pour les champs agissent très étrangement en effet ...

Tous les champs numériques ou de date sont retournés très bien; Je peux les utiliser dans le tableau. Les champs de texte, cependant, sont vides. Le tableau retourné est illustré ci-dessous dans sa forme brute:

Array 
(
    [0] => 
    [id] => 
    [1] => 
    [thread_id] => 820515612 
    [2] => 
    [poster_id] => 
    [3] => 
    [title] => 
    [4] => 
    [body] => 
    [5] => 
    [date] => 
    [6] => 
    [edit_date] => 
    [7] => 
    [edited] => 
    [8] => 
    [draft] => 
    [9] => 
    [spam] => 
    [10] => 820515612 
) 

Ignore les index numériques ici - je suis intéressé par ceux nommés. Les champs body et title sont des champs de texte (CHAR()) et ne s'affichent évidemment pas lorsqu'ils devraient l'être.

Qu'ai-je fait de mal ou de manqué ici? Est-ce parce que j'utilise CHAR()? J'en doute fortement mais je ne suis pas génial avec MySQL.

EDIT:

L'idée de cette requête est pour sélectionner tous les fils d'une table (tf_threads), et prendre le premier message sous ce fil d'une autre table (tf_posts) et en utilisant les messages title terrain le titre du fil.

Merci,

James

Répondre

1

Votre clause de jointure ne me fait pas de sens. Il semble que vous essayez d'obtenir tous les messages pour thread_id 54, mais vous ne joignez pas les deux tables, et vous n'obtiendrez aucune donnée de la table tf_threads autre que thread_id, qui je présume est également présent dans vos tf_posts table. Pourquoi ne pas simplement utiliser une clause WHERE:

SELECT * FROM tf_posts WHERE thread_id = 54 

Si cela ne fonctionne pas, s'il vous plaît poster vos descriptions de table et que la requête doit retourner.

Pour répondre à votre modification, vous devez rejoindre les tables puis, avec un INNER JOIN si vous ne voulez qu'un seul message - un LEFT JOIN vous donnerait tous les messages pour chaque fil.

SELECT tf_threads.*, tf_posts.* FROM tf_threads INNER JOIN tf_posts 
    ON tf_threads.thread_id = tf_posts.thread_id 
    ORDER BY tf_posts.date ASC 

Cela devrait vous donner toutes les discussions et le premier poste (tel que déterminé par la colonne de date) pour chaque fil.

+0

S'il vous plaît voir mes modifications. Merci. – Bojangles

+0

Édité ma réponse. – Thilo

+0

Cela fonctionne très bien - merci beaucoup :-) – Bojangles

0

SELECT tf_posts. *, Tf_threads.thread_id DE tf_threads LEFT JOIN tf_posts SUR tf_threads.thread_id = 54

semble mal

la clause ON devrait rejoindre les 2 tables ensemble à l'aide des champs dans les deux tables

SELECT tf_posts. *, Tf_threads.thread_id À PARTIR DE tf_threads LEFT JOIN tf_posts ON tf_posts.thread_id = tf_threads.thread_id O WH tf_threads.thread_id = 54

Et comme Thilo dit que si vous avez déjà l'ID de thread juste l'utiliser pour limiter les postes table avec une clause where

Questions connexes