OVH Cloud OVH Cloud

SELECT composé...

1 réponse
Avatar
yvon.thoravalNO
voici mon SELECT, qui ne marche pas :)

$sql = 'SELECT
t_ingredient_igd.igd_nom,t_mesure_msr.msr_nom,tj_necessite_nct.nct_quant
ite '.
'FROM tj_necessite_nct, t_mesure_msr,t_ingredient_igd '.
'WHERE (tj_necessite_nct.msr_id = t_mesure_msr.msr_id OR
tj_necessite_nct.msr_id IS NULL)'.
'AND tj_necessite_nct.igd_id = t_ingredient_igd.igd_id '.
'AND tj_necessite_nct.rct_id = "1"';


ce que je veux faire :

sélectionner :
t_ingredient_igd.igd_nom , t_mesure_msr.msr_nom ,
tj_necessite_nct.nct_quantite

quand tj_necessite_nct.msr_id n'est pas NULL

et sélectionner :

t_ingredient_igd.igd_nom , tj_necessite_nct.nct_quantite

ca correspond à deux cas de figure :

carotte 2 (pas d'unité de mesure tj_necessite_nct.msr_id est NULL)
carotte 1 kg (il y a une unité de mesure "" n'est pas NULL)

vaut-il mieux d'ailleurs ajouter dans t_mesure_msr un msr_nom vide ou
NULL

à fin d'éviter ce genre de pb ?
--
Yvon Thoraval

1 réponse

Avatar
yvon.thoravalNO
P'tit Marcel wrote:


déjà, il vaut mieux décrire explicitement les critères de jointure, ça
évite d'en oublier un critère et aboutir à une table de 1000000*100000
lignes :

SELECT i.igd_nom, m.msr_nom, n.nct_quantite
FROM tj_necessite_nct as n
LEFT JOIN t_mesure_msr as m
ON n.msr_id = m.msr_id
INNER JOIN t_ingredient_igd as i
ON n.igd_id = i.igd_id
WHERE n.rct_id = "1"

(au passage, emploie des alias pour les noms de table à rallonge)



ca marche impec ! merci beaucoup, il y a des gars vraiment en forme dès
le début d'année...

[...]

> ca correspond à deux cas de figure :
> carotte 2 (pas d'unité de mesure tj_necessite_nct.msr_id est NULL)
> carotte 1 kg (il y a une unité de mesure "" n'est pas NULL)

je suppose que m.msr_id est la clé primaire de la table mesure m donc elle
ne peut pas être nulle. Il suffit donc de définir une jointure ouverte de
la table necessite n vers la table mesure m pour choper aussi les lignes de
n sans correspondance dans m.



c'est exactement là-dessus que je bloquait, soit je n'avais pas assez de
valeurs (je ne prenais pas les ingrédients avec n.msr_id à NULL) soit
j'en avais beaucoup trop, comme tu dis + haut (je prenais tous les
ingrédients où n.msr_id est à NULL).
je ne comprenais pas pourquoi because "ma" "logique" avec AND et OR me
semblait correcte.

> vaut-il mieux d'ailleurs ajouter dans t_mesure_msr un
> NULL

Dans le cas précis cela reviendrait au même. Cela dit, il vaut mieux
distinguer la valeur NULL (= indéfini ou existant) de la valeur "" ( > défini comme égal à la chaîne vide).



[...]

OK, donc je reste comme j'ai fait càd avec n.msr_id à NULL qd il n'y a
pas de mesure associée à l'ingrédient.

merci encore, je dois retourner potasser les "JOIN".
--
Yvon Thoraval