2013-03-19 3 views
1

Ceci est mon code:MySQL équivaut à ne pas ne fonctionne pas

$query = mysql_query("SELECT P_Id, Thing,Something Date 
    FROM priv 
    WHERE Something = '$thing' AND thing2 <> 'This' 
    LIMIT 1" 
) or die(mysql_error()); 
code

fonctionne correctement sans déclaration "thing2 <> 'this'", mais quand je mets en œuvre "thing2 <> 'this'", elle renvoie 0 résultat. Comme s'il n'y avait pas de lignes vides dans la table, mais il y a des lignes vides (NULL) dans la ligne thing2 de la table. Le problème est que cette instruction "pas égal à" ne fonctionne pas, et j'ai tout essayé, mais elle ne retournera aucune valeur avec elle.

modifier (mot d'explication): Les colonnes ressemblent à ceci - P_Id | Quelque chose | Date | Thing1 | Chose 2 et je dois recevoir P_Id d'une ligne où Quelque chose = Quelque chose ET Thing1 pas EQLAS à 'ceci' (ci-dessus exemple) et Thing2 EGALEMENT PAS égal à 'this'. Je sais que cela semble fou.Sorry

Ok, donc j'ai essayé quelques expériences, et il semble que "thing2 <>" thingy ne fonctionne pas sur les colonnes things1/thing2, mais d'autres colonnes comme "Something" table où sont aussi entrées "this" cela fonctionne correctement n'est pas 'cette' entrée) .Mais pourquoi cela ne fonctionne pas avec les choses1 et 2? J'ai essayé de renommer les choses en colonne, mais pas de résultat.

+1

Pouvez-vous inclure des exemples de données et la production attendue? –

+0

Désolé.Mais la requête dit tout (c'est échantillon) – user2107321

+0

@ user2107321: non, la question ne ** pas ** contenir toutes les informations. Vous * pouvez * produire un petit tableau d'échantillons, nous dire le contenu et nous montrer le résultat d'une requête de test. C'est ce qu'on appelle un [SSCCE] (http://sscce.org) (assurez-vous de suivre et de lire ce lien!) Et c'est * une très bonne idée * à la fois pour trouver vous-même le problème * et * pour pouvoir communiquer le problème avec concision. –

Répondre

5

something <> NULL will evaluate to NULL. Et si utilisé dans une requête qui est à peu près le même que 0 (ou false). N'oubliez pas que SQL utilise three-valued logic et non une simple logique binaire.

Vous devrez peut-être vérifier NULL explicitement l'aide IS NULL:

... OR THING IS NULL 

Alernatively vous pouvez utiliser la NULL-safe equals operator <=> avec une négation (ce qui est MySQL spécifique, cependant, it's not standard SQL):

... AND NOT (THING <=> 'This') 
+0

+1 Je pense que la logique à trois valeurs est la réponse ici. – Kermit

+0

Pour résoudre ce problème, vous pouvez utiliser le paramètre "[null-safe] (http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to)" ("<=>") et l'opérateur 'NOT' (car il n'y a pas de" null-safe not equal "). 'O WH NON (thing2 <=> 'this')' –

+0

@RocketHazmat: intéressant, je ne savais pas que MySQL avait un tel opérateur. Ça te dérange si je l'ajoute à ma réponse? –