2010-08-25 3 views
0

Salut j'ai besoin d'aide avec une requête.
Mysql Join Issue

J'ai 4 tables

articles - id, category_id, user_id
catégories - id
article_category - article_id, category_id
utilisateurs - id

Le category_id dans le tableau de l'article est utilisé déterminer la catégorie principale

Maintenant, je veux obtenir tous les articles que j'utilise la requête ci-dessous.

L'article peut avoir plusieurs catégories. Je veux voir une liste d'articles avec les principales informations de la catégorie ci-joint

SELECT a. *, C.Title, c.slug des articles a, ac article_category, catégories c, les utilisateurs u
ac.article_id = a.category_id est censé être ac.article_id = a.id
ET ac.category_id = c.id
ET a.user_id = u.id
ET ac.category_id = '1'

Problème avec cette requête est que je reçois les informations de mauvaise catégorie et je ne pense pas que je devrais courir un sous-requête comme celle ci-dessous pour résoudre

(sélectionner le titre de catégories où id = a.category_id) que le titre

Merci

+0

OÙ ac.article_id = a.category_id, devrait être là où ac.category_id = a.category_id –

+0

Pouvez-vous être plus précis? Obtenez-vous les informations sur la catégorie "principale" pour tous les articles? Vos articles peuvent-ils avoir plus d'une catégorie? Voulez-vous voir chaque article une fois ou répété pour chaque catégorie qui s'y rattache? – Cfreak

+0

L'article @cfreak peut avoir plusieurs catégories. Je veux voir tout l'article une fois avec les informations de la catégorie principale ci-joint – Lylo

Répondre

0

Vos clauses de jointure étaient incorrectes. J'ai réécrite dans la syntaxe ANSI pour le rendre plus lisible, et les JOIN clauses plus explicites:

SELECT a.*, c.title , c.slug 
FROM articles a 
INNER JOIN article_category ac on ac.category_id = a.category_id 
INNER JOIN categories c on ac.category_id = c.id 
INNER JOIN users u on a.user_id = u.id 
WHERE ac.category_id = '1' 

, vous êtes ailleurs se joindre contre la table users mais pas sélectionner toutes les colonnes de celle-ci, de sorte que vous pouvez supprimer cette jointure, sauf si vous l'utilisez pour filtrer les résultats.

0

table utilisateurs Retiré de la requête (n'a pas du tout utilisé), changé l'état de ac.article_id = a.category_id à ac.category_id = a.category_id

 SELECT a.*, c.title , c.slug 
     FROM articles a, article_category ac, categories c 
     WHERE ac.category_id = a.category_id 
     AND ac.category_id = c.id 
     AND ac.category_id = '1' 
0
select a.*, c.title, c.slug 
from articles a 
join article_category ac on a.id = ac.article_id 
join categories c on ac.category_id = c.id 
join users u on a.user_id = u.id 
where c.id = 1 
0

vous rejoignez sur article_id = category_id, qui n'a pas de sens, essayez qu'au lieu:

SELECT a.*, c.title , c.slug FROM articles a, article_category ac, categories c, users u 
WHERE ac.category_id = a.category_id 
AND ac.category_id = c.id 
AND a.user_id = u.id 
AND ac.category_id = '1'