2009-10-21 10 views

Répondre

1

Ceci est mieux fait avec 2 requêtes. Le premier renvoie les enregistrements où field='x'. Si c'est vide, faites une requête pour un enregistrement aléatoire avec field!='x'. Obtenir un enregistrement aléatoire peut être très inefficace comme vous le verrez à partir du nombre de questions «Obtenir un enregistrement aléatoire» sur SO. Pour cette raison, vous ne voulez vraiment le faire que si vous devez absolument le faire.

0

Juste le bit pour sélectionner un enregistrement aléatoire serait très difficile et très inefficace sur les grandes tables dans mysql, dans ce website vous pouvez trouver un script pour le faire, il devrait être trivial d'ajouter votre condition pour 'x' et obtenir la fonctionnalité dont vous avez besoin.

0

Eh bien, voici mon exemple basé sur table mysql.users:

En premier lieu, les dossiers non existants:

mysql> SELECT * FROM (select user, 1 as q from user where user like '%z' union all (select user, 0 from user limit 1)) b WHERE q=(SELECT CASE WHEN EXISTS(select user, 1 as q from user where user like '%z') THEN 1 ELSE 0 END); 

+--------+---+ 
| user | q | 
+--------+---+ 
| drupal | 0 | 
+--------+---+ 

1 row in set (0.00 sec) 

Ensuite, existant:

mysql> SELECT * FROM (select user, 1 as q from user where user like '%t' union all (select user, 0 from user limit 1)) b WHERE q=(SELECT CASE WHEN EXISTS(select user, 1 as q from user where user like '%t') THEN 1 ELSE 0 END); 

+------------------+---+ 
| user    | q | 
+------------------+---+ 
| root    | 1 | 
| root    | 1 | 
| debian-sys-maint | 1 | 
| root    | 1 | 
+------------------+---+ 

4 rows in set (0.00 sec) 

Peut-être qu'il sera utile , ou peut-être quelqu'un sera en mesure de le réécrire de meilleure façon.

Questions connexes