2009-07-09 7 views
0

Tout d'abord, excusez mon titre de sujet pauvre. Je n'ai tout simplement aucune idée de comment formuler cette question ou ce que Google après, alors ne me tirez pas si c'est quelque chose de facile à répondre.MySQL se joint, comment sortir la relation "la bonne façon"

Supposons que je les tableaux suivants:

[AUTEURS] id, nom

[NOUVELLES] id, article, AUTHOR_ID

Si je voulais afficher un élément de nouvelles et de sortie l'auteur correspondant (stocké dans author_id), je ferais la requête suivante:

SELECT * FROM `news` JOIN `authors` ON news.author_id = authors.id 

Et puis la sortie en faisant quelque chose comme ça

$Q = "SELECT * FROM news JOIN authors ON news.author_id=news.id"; 

$query = $this->lite->query($Q) or die($this->lite->error); 

$result=null; while($obj = $query->fetch_object()){ 
     $result.= '<li>'.$obj->item. 'by ' . $obj->name . '</li>'; 
} 

Ici, $ obj-> nom contiendrait le nom de l'auteur et s'afficherait avec succès. Alors, que se passe-t-il si le champ "name" s'appelait "item" à la place? Il y aurait évidemment des conflits. Avec mon expérience précédente dans Propel & symfony, je ferais quelque chose comme ceci: getAuthorId() -> getName() - mais pour ce projet, je dois écrire SQL à partir de zéro.

+0

Pouvez-vous donner plus de détails sur votre cours? Est-ce qu'il récupère tous les params dans l'objet? – lfx

Répondre

6

N'utilisez jamais la syntaxe * dans le code de production.

Ressaisissez votre requête comme ceci:

SELECT news.item AS news_item, author.name AS author_name 
FROM `news` 
JOIN `authors` 
ON  news.author_id = authors.id 

, aliasing vos champs nécessaires pour éviter les conflits de noms.

+0

Merci beaucoup! Cela a fait l'affaire. Ce n'est pas un code de production, bien sûr :-) – subZero

1

Vous devez utiliser un nom qualifié comme news.item ou authors.item.

0

-vous les nommer explicitement

SELECT n.id, n.item, n.author_id,a.name,a.id 
FROM 
`news` as n JOIN `authors` as a 
ON 
n.author_id = n.id 

;

Ou peut-être plus comme

SELECT n.id as newsid, n.item as newsitem, n.author_id as autohor_authorid, 
a.name as authorname,a.id as authorid 
FROM 
`news` as n JOIN `authors` as a 
ON 
n.author_id = n.id; 

Vous ne devez retirer les colonnes dont vous avez besoin en fait. Il est considéré comme un mauvais style pour sélectionner *, toujours nommer les colonnes qui vous intéressent, ou il est facile de casser le code si par ex. une autre colonne est ajoutée à la table.