select ... où id = n'importe quelle valeur. c'est possible?
regardez ce tableau, veuillez
table
|id| |name| |order|
je dois obtenir les lignes, où name = something
et order = somevalue
donc j'écris
select `id` from `table` where `name` = 'something' and `order` = 'somevalue'
mais dépendent de php logique, parfois j'ai besoin d'obtenir toutes les lignes, où name = something
indépendamment de order
valeur. je ne veux pas changer la structure de la requête, parce que dans la pratique, il existe de nombreux nombre de champs, et possible nombre de requêtes va devenir très gros. je tiens donc à enregistrer la structure de la requête, et quand j'en ai besoin pour sélectionner juste par son nom, je veux écrire quelque chose comme ceci:
select `id` from `table` where `name` = 'something' and `order` = any value
est-il possible?
grâce
source d'informationauteur Simon | 2010-05-20
Vous devez vous connecter pour publier un commentaire.
Bien, c'est une sorte de hack, mais si vous avez vraiment besoin pour ce faire, il vous fonctionne comme ceci:
Alors vous êtes juste en disant: "où est la même que lui-même", il est donc toujours vrai.
Non, ce n'est pas possible. Vous avez besoin de changer la structure (en option pour un COMME de sorte que vous pouvez utiliser '%', mais c'est très laid).
Cependant, vous n'avez pas besoin d'écrire une requête différente pour gérer toutes les combinaisons possibles. Vous pouvez simplement créer la requête dynamiquement:
Notez que vous devez toujours prendre des mesures appropriées pour éviter l'injection SQL et d'autres problèmes de sécurité, je n'ai pas inclus ici dans le but de garder les choses simples.
Si vous utilisez des paramètres liés, il serait impossible.
Si vous venez de remplacer les valeurs, vous pouvez effectuer les opérations suivantes:
Je ne pense pas que vous avez le choix... une Fois que vous faites un choix, vous ne pouvez pas "unfilter" et obtenir plus de lignes.
Vous devez utiliser deux requêtes-- soit deux indépendants des requêtes, ou de celui qui sélectionne sur le nom dans une table temporaire, et puis (éventuellement) une que les autres sélectionne sur l'ordre de l'attribut.
Comme le Tchad dit ci-dessus, il suffit de définir la colonne égal à lui-même. Mais attention, sur certaines plates-formes /installer les configurations, NULL != NULL:
C'est un thème commun avec les requêtes de base de données - vous besoin d'une variable de requête en fonction de combien de filtrage que vous souhaitez appliquer aux données qu'il interroge. Vous pouvez aller de l'itinéraire d'avoir votre requête répétée comme une chaîne tout au long de votre code, mais c'est une mauvaise pratique car elle augmente la complexité du code inutilement. Les Chances pour les erreurs se produisent si vous avez besoin de modifier la requête pour une raison quelconque, et de modifier dans plusieurs endroits comme un résultat.
La meilleure solution est de créer une fonction qui génère la requête pour vous exécutez:
Vous pouvez ensuite exécuter ce pour juste en utilisant le champ "nom":
Ou la ce pour l'utilisation de deux champs:
Comme quelqu'un l'a mentionné ci-dessus, ce code est volontairement simplifié et ne contient aucun plan d'urgence pour la peut-être dangereux de données transmis via $nom ou de l'ordre de$. Vous devez utiliser mysql_real_escape_string ou quelque chose de similaire pour nettoyer les données de la première, au début de la fonction avant de l'une ou l'autre de données est utilisé.
Dynamique de génération de requête est un fait de la vie de Byron dit, je voudrais donc pris l'habitude maintenant, plutôt que d'utiliser le hack-ish solutions de contournement.
À la réflexion, j'ai une meilleure réponse. Mon collègue m'a montré une certaine manière cela peut être fait.
Mon exemple...
Les variables doivent être la même.
S'ils sont tous deux à 5 par exemple, le premier booléen sera faux, mais le second sera le cas pour les lignes où les utilisateurs id est 5.
Si vous avez besoin de "tous", comme une chaîne vide entraînera dans toutes les lignes de respecter la clause where condition.
Ne pouvez-vous pas simplement utiliser un
not null
requête ici?Vous devriez être en mesure de le faire comme ceci:
Qui va sélectionner n'importe où, que la valeur n'est pas égale à vide.