Soit chuis pas encore bien réveillé, soit y a un truc qui m'échappe dans ta requête Calimero
Je vois vraiment pas comment tu arrives a faire une jointure entre les deux tables... tb_jeux.language !=0 vas t'enlever les jeux qui n'ont pas de langue et language.id_language va te retourner vrai.. tu vas te retrouver avec un produit entre les deux tables sans pour autant savoir si un 6 (chinois + anglais) contient ou pas la valeur 1 (français)
Bref, si ça fonctionne et que tu arrives à m'epliquer comment, c'est moi qui te l'offre la crèpe

Le principe est simple et très utilisé, notamment quand tu codes en C : regarde attentivement les valeurs d'id de cette table :
Ce sont des puissances de deux. Voici comment se présentent ces nombres en représentation binaire (pour être simple et lisible j'aligne sur deux octets, soit 16 bits, sachant que mysql travaille sur un nombre de bits bien plus élevé (64 il me semble)), donc pas de risque de déborder dans ce cas précis:
Code : Tout sélectionner
id.............id en binaire
----------------------------------------
1..............00000000.00000001
2..............00000000.00000010
4..............00000000.00000100
8..............00000000.00001000
16.............00000000.00010000
32.............00000000.00100000
64.............00000000.01000000
128............00000000.10000000
256............00000001.00000000
512............00000010.00000000
// Attention ici on a sauté une puissance
2048...........00001000.00000000
4096...........00010000.00000000
8192...........00100000.00000000
Ca c'est pour bien suivre comment fonctionne l'opérateur & logique. On appelle ceci un masque de bits.
Quand tu fais une jointure classique, tu cherches une égalité entre deux champs dans des tables différentes. Un esprit tordu (

), si les deux champs sont de type numériques, pourrait écrire ce test d'égalité comme une simple soustraction et tester l'égalité du résultat de cette soustraction avec 0, ce qui reviendrait au même... A l'exception que cela demande un traitement préalable sur les valeurs lues et l'évaluation systématique du résultat de ce traitement.
Dans ce cas présent, c'est la même chose : la jointure se fait en faisant un ET logique entre les deux champs et en testant le résultat (si c'est 0, cela veut dire que la valeur contenue dans tb_jeux.languages ne respecte pas le masque demandé, si c'est autre chose que 0 c'est le contraire).
Pas assez clair ? Je peux détailler si besoin. Sinon, tu peux préparer la crêpe... et le cidre

Modifié en dernier par
Calimero le 21 janv. 2008, 11:42, modifié 1 fois.