2009-10-04 5 views
0

Je filtre les valeurs NULL, en PHP sur MYSQL. Quand une valeur nulle est lue, j'ai besoin de MySQL pour lire l'enregistrement suivant.Lire l'enregistrement suivant

Comment puis-je faire cela? Pourquoi ne pas filtrer ces valeurs nulles à la source, c'est-à-dire dans la requête SQL.

+0

Comment lisez-vous les enregistrements? –

Répondre

2

En ajoutant quelque chose comme ce qui suit dans la clause WHERE.

WHERE ... -- existing conditions 
AND TheFieldOfInterest IS NOT NULL 
+0

fait cela, mais je "veux" juste savoir d'une autre façon: D, désolé d'être si curieux –

+0

Il n'y a pas d'autre moyen que de définir de telles conditions. Si vous le devez * vraiment *, vous pouvez déplacer la condition dans la clause HAVING, mais ce n'est pas le cas de la clause HAVING et elle est même plus lente que dans la clause WHERE. – soulmerge

0

Exactement comme mjv déjà mentionné, vous voulez dire MySQL pour sauter les lignes qui ont une valeur NULL dans une colonne particulière. Comme il se trouve dans votre question "Quand une valeur nulle est lue, j'ai besoin de MySQL pour lire l'enregistrement suivant." : C'est exactement ce que fera MySQL lorsque vous lui dites de ne pas inclure les valeurs NULL dans le jeu de résultats en spécifiant la condition WHERE.

amusement hacking :)

0

En PHP, vous pouvez utiliser la fonction is_null() pour détecter si une variable est nulle ou non

$result = mysql_query("SELECT foo FROM bar;"); 
while($values = mysql_fetch_assoc($result)) 
{ 
    if (is_null($values["foo"])) 
     continue; //Skip processing of this row 

    echo "Data: ".$values["foo"]; 
} 
0

Je suis d'accord que vous ne devriez pas interroger toutes les données et puis filtrez le jeu de résultats sur le mysql-client (votre script php). Mais:

fait cela, mais je "veux" juste savoir d'une autre façon: D
Il n'y a rien de mal à être curieux. Et: Plus de puissance à PDO et SPL, esp. FilterIterator dans ce cas.

class ElementIssetFilter extends FilterIterator { 
    protected $index; 
    public function __construct(Iterator $iter, $index) { 
    parent::__construct($iter); 
    $this->index = $index; 
    } 

    public function accept() { 
    $c = $this->current(); 
    return isset($c[$this->index]); 
    } 
} 

$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// testtable and -data 
$pdo->exec("CREATE TEMPORARY TABLE foo (id int auto_increment, v varchar(16), primary key(id))"); 
$pdo->exec("INSERT INTO foo (v) VALUES ('1'), (null), ('3'), ('4'), (null), ('6')"); 

$result = $pdo->query('SELECT id,v FROM foo'); 
$iter = new IteratorIterator($result); 
$filterIter = new ElementIssetFilter($iter, 'v'); 

foreach($filterIter as $e) { 
    echo $e['id'], " ", $e['v'], "\n"; 
} 

$ filterIter agira comme résultat de $, sauf que les lignes avec des valeurs NULL dans [ 'v'] seront filtrés. Vous n'avez pas besoin de changer le code "consommateur", c'est-à-dire que la même méthode foreach-loop (ou appel de fonction/méthode ou autre) fonctionnerait avec $ result au lieu de $ filterIter.