mysql select de la requête dans un tableau sérialisé
Je suis stocker une liste d'éléments dans un tableau sérialisé dans un champ dans ma base de données (je suis en utilisant PHP/MySQL).
Je veux avoir une requête qui va sélectionner tous les enregistrements qui contiennent un seul de ces éléments dans le tableau.
Quelque chose comme ceci:
select * from table WHERE (an item in my array) = '$n'
J'espère que ça a du sens.
Toutes les idées seraient grandement appréciés.
Grâce
À moins que vos articles ont une façon très particulière de les identifier, vous serez probablement mieux pour stocker les données sérialisées comme une table ou quelque chose d'autre.
quel genre de tableau? entiers? les chaînes? mixte? Pouvez-vous fournir des exemples d'enregistrements?
Ne jamais stocker des données sérialisées que vous souhaitez à la recherche...
Select * from table where table_field like '%"enter_your_value"%'
quel genre de tableau? entiers? les chaînes? mixte? Pouvez-vous fournir des exemples d'enregistrements?
Ne jamais stocker des données sérialisées que vous souhaitez à la recherche...
Select * from table where table_field like '%"enter_your_value"%'
OriginalL'auteur Daelan | 2010-11-07
Vous devez vous connecter pour publier un commentaire.
Si tu veux utiliser MySQL pour effectuer une recherche dans un tableau PHP qui a été sérialisé avec la sérialiser de commande et stockées dans un champ de base de données? Ma première réaction serait: OMG. Ma deuxième réaction est: pourquoi? Le sensible chose à faire est soit:
J'opte pour la deuxième option, mais je ne sais pas votre contexte.
Bien sûr, si vous le voulez vraiment, vous pouvez essayer quelque chose avec
SUBSTRING
ou d'une autre fonction MySQL et d'essayer de manipuler le champ, mais je ne vois pas pourquoi vous voulez. C'est lourd, et il serait inutile, moche hack. D'autre part, c'est un casse-tête, et les gens d'ici ont tendance à aimer les puzzles, alors si vous voulez vraiment puis de publier le contenu de votre domaine et nous pouvons donner un coup de feu.> "OMG. Ma deuxième réaction est: pourquoi? La chose la plus sensée à faire est de:" Comment condescendant. Souvent, lorsque l'on travaille avec des systèmes de CMS comme Drupal et WordPress, vous n'avez aucun contrôle sur le format qu'un autre aveugle programmeur stockées leurs données.
OriginalL'auteur thomaspaulb
Comme GWW est dit dans les commentaires, si vous avez besoin d'interroger les choses de cette façon, vous devriez vraiment envisager le stockage de ces données comme autre chose qu'un grand-ole-chaîne (qui est ce que votre tableau sérialisé est).
Si ce n'est pas possible (ou que vous êtes tout simplement paresseux), vous pouvez utiliser le fait que le tableau sérialisé est juste un grand-ole-chaîne, et figure une clause LIKE pour trouver les enregistrements correspondants. La façon dont PHP sérialise les données est assez facile à comprendre (remarque: ces chiffres indiquent les longueurs de choses).
Maintenant, si votre tableau sérialisé est assez complexe, ce sera décomposent. Mais si c'est un tableau plat, vous devriez être en mesure de le faire.
De sûr, vous allez à l'aide de LIKE'%...%, de sorte que vous n'aurez pas d'aide d'un indicies, et les performances seront très pauvres.
Qui est pourquoi les gens sont à suggérant vous rangez que certaines données normalisées de la mode, si vous avez besoin d'interroger "l'intérieur".
OriginalL'auteur timdev
Si vous avez le contrôle du modèle de données, la farce de données sérialisées dans la base de données va vous mordre dans le long terme, juste au sujet de toujours. Cependant, souvent un ne pas avoir le contrôle sur le modèle de données, par exemple lorsque vous travaillez avec certains open source, systèmes de gestion de contenu. Drupal colle un beaucoup de données sérialisées dans la benne de colonnes en lieu et place d'un bon modèle. Par exemple, ubercart est un "data" de la colonne pour l'ensemble de ses commandes. Des modules contribués besoin de joindre des données de la commande principale de l'entité, afin de sortir de la commodité qu'ils le cloue sur le sérialisé blob. En tant que tierce partie à la présente, j'ai encore besoin d'un moyen d'obtenir certaines données farci au il y de répondre à quelques questions.
voir que "old_order_id'? c'est la clé que j'ai besoin de savoir où cette récurrents de l'ordre est venu, mais depuis pas tout le monde utilise les commandes récurrentes module, il n'y a pas d'endroit pour les stocker dans la base de données, de sorte que le module développeur opté pour des trucs dans la benne de la table.
Ma solution est d'utiliser quelques ciblées SUBSTRING_INDEX est de ciseau sur négligeable de données jusqu'à ce que j'ai sculpté la chaîne résultante dans les données de pierres précieuses de mes désirs.
Puis-je ajouter une clause HAVING pour trouver tous les qui correspondent, comme suit:
Le plus profond SUBSTRING_INDEX me donne tout le passé de la old_order_id, et les deux extérieurs nettoyer le reste.
Cette compliqué hackery n'est pas quelque chose que vous voulez dans le code qui s'exécute plus d'une fois, plus d'un outil pour obtenir les données d'une table sans avoir à recourir à l'écriture d'un script php.
Noter que cette pourrait être simplifié simplement
mais qui ne fonctionne que dans ce cas précis (la valeur que je veux c'est à la fin des données blob)
C'est bien plus utiles que les commentaires précédents...comme vous l'avez dit, Drupal/Ubercart se sont rendus coupables de cette situation, afin de dire aux gens qu'ils doivent reconstruire la maison, quand tout ce qu'ils demandent est de savoir comment changer une ampoule n'est pas totalement utile
OriginalL'auteur Mixologic
Que diriez-vous sérialiser la valeur que vous recherchez?
ou
sprintf("select * from tbl WHERE serialized_col like '%%%s%%'", $mysqli->real_escape_string(serialize($n)));
OriginalL'auteur ryanlahue
Vous pouvez le faire comme ceci:
Mais de toute façon, vous devriez envisager de stocker les données dans un tableau distinct.
Œuvres! Ne savais pas que vous pourriez faire des regex recherches dans mysql. Évidemment très lent, mais excellent ! Notez que sérialiser ne pas échapper le caractère spécial de valeurs, de sorte que le item_value doit être remplacé par un db échappé à la chaîne.
OriginalL'auteur Donatas Olsevičius
Bien, j'ai eu le même problème, et apparemment, c'est un morceau de gâteau, mais peut-être qu'il a besoin de plus de tests.
Simplement utiliser l'instruction, mais de mettre le champ lui-même en tant que tableau!
Exemple:
~ où '2' est la valeur que je suis à la recherche à l'intérieur du champ 'child_of" qui est un tableau sérialisé.
Ce tableau sérialisé était nécessaire, parce que je ne peut pas dupliquer les dossiers pour stocker ce que l'id qu'ils étaient enfants de.
Acclamations
Ne fonctionne pas pour moi.
Qui ne fonctionnera que si la valeur que vous recherchez est rare d'en existe nulle part ailleurs sur l'accident. par exemple, '2' serait une chose terrible à rechercher dans un tableau sérialisé que le php met la taille de ses valeurs de données dans la chaîne de sortie, donc vous auriez du match beaucoup, beaucoup de résultats. c'est à dire Dans mon cas, j'ai été à la recherche pour le 25. Il a frappé de nombreux faux matchs.
OriginalL'auteur Alan M. Maziero
Vous cherchez peut-être pour un SQL DANS l'énoncé.
http://www.w3schools.com/sql/sql_in.asp
Vous aurez à briser votre tableau un peu d'abord. Vous ne pouvez pas simplement à la main un tableau hors de MySQL et espérer qu'il saura quoi faire avec elle. Pour cela, vous pouvez essayer de sérialisation avec PHP exploser.
http://php.net/manual/en/function.explode.php
OriginalL'auteur jocull
OriginalL'auteur shafi
OriginalL'auteur user2823361
OriginalL'auteur Dragi Postolovski
Essayez de passer à postgresql ou mongodb. Votre déclaration de mal à la 1ère forme normale, peut-être pure de bases de données relationnelles n'est pas ce que tu veut.
OriginalL'auteur Fernando Silva