SELECT sur plusieurs tables avec les résultats à la suite

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : SELECT sur plusieurs tables avec les résultats à la suite

Re: SELECT sur plusieurs tables avec les résultats à la suite

par ouckileou » 28 oct. 2010, 16:29

je pense que tu peux te contente de sélectionner les produits qui ont leur flag "affichage slider" à 1, et de faire une jointure externe
C'est effectivement ça. Donc une table de mes produits, une table des... disons des promotions (je vois pas ce que ça peut être d'autre mais ne sait-on jamais).
La table des promotions aura donc les champs (id-promo, fk-product, display-slider, slider-pos, desc).
Ton slider affichant des produits et des promotions sur produits, le dénominateur commun est donc "produit", je mettrais le flag "affichage slider" dans "produits". Ta requête remplissant le slider sélectionnera les produits à afficher (flag=1), et regardera s'il y a éventuellement une promotion associée.
Et il faut qu'une ligne de promo ai aussi les champs desc, name (ou plus) du produit auquel elle est liée...
Pourquoi ?
Tu sélectionnes déjà le produit associé à la promotion donc tu as tout non ?
Mais les jointures ne servent-elles pas à "remplacer" simplement une FK par une valeur d'une autre table (par exemple) ? (je vais m'en aller lire une ou deux docs sur les jointures, et fissa !)
Non, les jointures se base sur les PK/FK pour associer des tuples dans les résultats.
produit(id_produit, nom_produit)
promotion(id_promo, desc_promo, fk_produit)

La fk_produit de promotions relie un tuple de produit à un tuple de promotion correspondant à ce produit. La jointure se basera sur pk_produit/fk_produit pour sélectionner les bonnes infos.

Re: SELECT sur plusieurs tables avec les résultats à la suite

par Didjo » 28 oct. 2010, 16:09

Merci de ta rapidité, ouckileou :)

Non ma base est relativement petite (40 produits actuellement, peut être 100 maximum, et jamais plus de 10 éléments dans le slider).
Je ne savais pas encore à quelles fin était vouée cette table, c'est pour ça que temporairement, "slider" était le plus pertinent...
je pense que tu peux te contente de sélectionner les produits qui ont leur flag "affichage slider" à 1, et de faire une jointure externe
C'est effectivement ça. Donc une table de mes produits, une table des... disons des promotions (je vois pas ce que ça peut être d'autre mais ne sait-on jamais).
La table des promotions aura donc les champs (id-promo, fk-product, display-slider, slider-pos, desc).
Et il faut qu'une ligne de promo ai aussi les champs desc, name (ou plus) du produit auquel elle est liée...

Mais les jointures ne servent-elles pas à "remplacer" simplement une FK par une valeur d'une autre table (par exemple) ? (je vais m'en aller lire une ou deux docs sur les jointures, et fissa !)

Re: SELECT sur plusieurs tables avec les résultats à la suite

par ouckileou » 28 oct. 2010, 15:46

Oui à première vue on dirait que tu t'es orienté vers quelque chose de très complexe alors que finalement, c'est plutôt "simple". Simple dans le sens que tu n'as que des produits, des promotions, et que ces promotions portent toutes vers des produits non ? Ou tu peux avoir une promotion générique "Frais de port offert du tant au tant" ?

Déjà c'est un détail mais je nommerais mes tables suivant les entités (produit, promotion) et non suivant un bloc du site ("slider").

Si tu n'a que des produits (id_produit, description etc) et des promotions reliées à des produits (id_promotion, fk_produit, description_promo etc), je pense que tu peux te contente de sélectionner les produits qui ont leur flag "affichage slider" à 1, et de faire une jointure externe (left/right join pour prendre les promotions avec mais que les produits sans promo sortent quand même).

À moins que tu ais une TRES GROSSE base, je ne pense pas qu'il soit utile de créer une table spéciale. Ou alors juste : slider(id_slide, fk_produit, fk_position)

Re: SELECT sur plusieurs tables avec les résultats à la suite

par Didjo » 28 oct. 2010, 15:26

Effectivement c'est pas très clair ! :wink:

Pour faire simple, j'ai un site vitrine qui présente des produits rangés par catégories, et j'ai sur la page d'accueil un bloc (type slider) qui affiche certain de ces produits. Mon index va donc chercher les produits dont le champ "display-slider" est définit à 1 pour les lister, et récupère son id (et donc l'image associée), son nom, sa description, etc.
Sauf que j'ai une nouvelle demande, ce bloc slider ne doit plus seulement contenir des produits déjà enregistrés dans la base, mais aussi des offres type promotion, liées à un produit. J'ai donc deux types d'infos dans ce bloc slider : soit des produits, soit des promotions (ou autre) liées à un produit.

Ce que j'ai imaginé, c'est donc créer une autre table, "slider", dans laquelle je met les promotions en question, où les champs ne sont que un id (pour une autre image que celle du produit), l'id du produit (pour l'associer à la promotion et lier vers ce produit), une position, une description et un display-slider pour ne pas l'afficher mais la garder en mémoire au cas où.

Je veux donc que mon index aille chercher les produits ("products") et les promotions ("slider") qui ont un display-slider positif ("1"), pour ensuite avoir un résultat de ce type :

Code : Tout sélectionner

# - id (du produit) - categorie - url - name - slider-desc - slider-pos # - 12 - catA - urlduproduit - Mon Produit - Ma Description - 1 # - 65 - catB - urlduproduit - Mon Produit - Ma Description - 2 # - 7 - catA - urlduproduit - Mon Produit - Ma Description - 3 # - 24 - catA - urlduproduit - Mon Produit - Ma Description - 4 # - 78 - catC - urlduproduit - Mon Produit - Ma Description - 5
Mais au fur et à mesure que j'écris tout ça, je me dis qu'il serait peut-être plus simple que la table "slider" recense toutes les infos devant être affichées dans le bloc slider, et que chaque info soit un lien vers un produit (auquel cas on a juste un id-produit et il faut récupérer les infos de ce produit dans "products"), ou alors une promotion (et là on a une description, un nom etc. différents du produit, mais de quoi le lier quand même, donc id et url).

Qu'en pensez-vous ?

Re: SELECT sur plusieurs tables avec les résultats à la suite

par ouckileou » 28 oct. 2010, 13:18

Je pense que tu devrais d'abord nous expliquer ce que tu veux faire en français, nous dire quel est le but de tout ça, sans parler de SQL. Déjà c'est plus facile pour ceux qui veulent t'aider et peut-être qu'il y a d'autres solutions plus simples que ce vers quoi tu es parti

Et si tu nous dit "j'ai essayé ça", donne des précisions. Montre ce que tu as essayé (pas juste "un UNION") et explique ce que veut dire "ça ne donne pas ce que je veux" :)

SELECT sur plusieurs tables avec les résultats à la suite

par Didjo » 28 oct. 2010, 12:43

Bonjour !

Je bloque sur une requête depuis un moment et malgré ce que j'ai pu trouvé, je n'arrive pas à résoudre l'affaire...

J'ai deux tables :
products (id, cat, url, name-fr, display-slider, slider-pos, slider-desc-fr, et d'autres...)
slider (id-slider, id, display-slider, slider-pos, slider-desc-fr)

L'organisation pourrait être un peu mieux faite mais c'est le résultat d'un changement permanent de décisions, et je n'ai que moyennement envie de reconstruire tout le site...
Ce que je veux serait en fait un résultat qui sera un assemblage de deux SELECT, en l'occurrence ceux-ci
SELECT `products`.`id`, `products`.`cat`, `products`.`url`, `products`.`name-fr` AS "name",  `slider-desc-fr` AS "desc", `slider-pos` FROM `products` WHERE `products`.`display-slider` = "1"
SELECT `slider`.`id`, `slider-desc-fr` AS "desc", `slider-pos` FROM `slider` WHERE `slider`.`display-slider` = "1"
le tout rangé (ORDER BY `slider-pos` ASC), et avec des champs NULL pour les colonnes qui n'existent pas dans l'autre table...

J'ai tenté un UNION, mais il veut obligatoirement le même nombre de colonnes, un JOIN mai ça ne me donne pas ce que je veux...

Mais peut-être devrais-je me débrouiller autrement :
Ne mettre dans la table slider que ce que je veux sélectionner, et que ma requête aille chercher les infos dont j'ai besoin (url, name etc.) dans la table product... Sauf que ça je ne sais pas comment le faire...

Quel est le plus simple à mettre en place ? Le second me semble plus logique en tout cas...

J'en appel à vos lumières ! :D