2010-12-11 10 views
0

J'ai une table dans mon DB appelé ORDRES et il ressemble à ceci:MySQL - Comment se joindre à un index inexistant?

ID_section (int), ID_price (int), ID_city (int), ID_company (int)

Je veux utiliser la Méthode JOIN pour définir les noms des ID.

Ce que je voudrais faire est:

SELECT * FROM ORDERS 
JOIN sections ON sections.id=orders.ID_section 
JOIN prices ON prices.id=orders.ID_price 
JOIN cities on cities.id=orders.ID_cities 
JOIN companies ON companies.id=orders.ID_company 

Mais le point est que dans le tableau ORDRES peut être inséré valeur de 0 et cela signifie - toutes les sections/prix/villes/entreprises, mais quand je lance ma requête, seulement les valeurs, que leur ID existe dans l'autre tableau apparaît.

Des idées? Merci.

Répondre

0

Utilisation LEFT JOIN au lieu de JOIN (qui est un raccourci pour INNER JOIN)

+0

Ce n'est pas correct. Une jointure à gauche avec retourner les ordres avec rien d'autre associé. Il veut ** tout ** associé lorsqu'il y a un 0 ID. –

+0

Voilà comment vous le comprenez. Je reste fidèle à ma réponse. – Mchl

+0

"valeur de 0 et cela signifie - ** toutes les ** sections/prix/villes/entreprises" Je comprends de ce qu'il veut correspondre à tout dans cette catégorie lorsque l'ID_ est 0. –

1

Si je vous comprends correctement à la question et ayant, par exemple, ID_section = 0 signifie que l'ordre appartient à toute la section, puis la requête suivante devrait faire la tour.

SELECT * FROM ORDERS 
JOIN sections ON sections.id=orders.ID_section OR orders.ID_section = 0 
JOIN prices ON prices.id=orders.ID_price OR orders.ID_price = 0 
JOIN cities on cities.id=orders.ID_cities OR orders.ID_cities = 0 
JOIN companies ON companies.id=orders.ID_company OR orders.ID_company = 0 

Si, d'autre part, vous voulez récupérer toutes les commandes peu importe si elles ont des sections, les prix, etc. associés, il suffit de mettre LEFT JOIN où vous avez JOIN. (Mais cette situation ne résulte pas de votre question! Je l'ai seulement ajouté parce que les gens semblent le comprendre.)

+0

Ce n'est pas correct. Comme indiqué dans la question, il n'y a pas de lignes avec ID = 0 dans ces tables. : P – Mchl

+0

@Mchl Donc? Où me voyez-vous vérifier pour 'id = 0'? Je vérifie seulement pour 'ID_ ' étant 0. –

+0

Oui. J'ai écrit ID au lieu d'écrire des noms complets pour gagner du temps. – Mchl

0

Expérimentez avec LEFT et RIGHT OUTER JOIN s et vous serez en mesure de comprendre ce que vous devez faire. Fondamentalement, un OUTER JOIN GAUCHE ou DROIT insère NULLS dans des colonnes où aucune donnée n'existe, mais toujours faire les jointures.

Il existe various resources sur le Web qui explique cela.