Avoir un problème en sélectionnant des lignes. Avoir le champ location_ids et il a une valeur par exemple - ["13", "5", "25"]. Je veux chercher dans ce champ et s'il trouve le numéro 13 par exemple, il sélectionne une ligne

J'ai trouvé que cela pouvait être fait avec la fonction FIND_IN_SET mais cela n'a pas fonctionné pour moi SELECT * FROM staffs WHERE FIND_IN_SET(13, locations_ids)

Peut-être que cela pourrait être fait avec des fonctions JSON?

Merci pour les réponses

0
Kintamasis 1 mai 2017 à 17:28

3 réponses

Meilleure réponse

Vous devriez utiliser regexp dans ce cas. C'est ce que j'utilise pour rechercher dans les colonnes contenues dans json. Cela fonctionnerait aussi dans votre cas.

WHERE locations_ids REGEXP '[[:<:]]13[[:>:]]'
1
abeyaz 1 mai 2017 à 14:41

Pourquoi ne pas simplement reformater le tableau et utiliser IN?

SELECT * 
FROM staffs 
WHERE locations_ids in (13,5,25)

Si locations_ids contient ["13", "5", "25"] , essayez ceci:

SELECT *
FROM staffs
WHERE locations_ids like '%"13"%'
0
Sloan Thrasher 1 mai 2017 à 15:07

FIND_IN_SET(13, locations_ids) fonctionnerait, si le locations_ids était '13, 5, 25'. Mais avec votre format, vous pouvez utiliser

JSON_CONTAINS(location_ids, '"13"')

Démo: http://rextester.com/HLLY47255

Notez qu'aucune des deux méthodes ne permet d'utiliser un index pour une recherche rapide. Avec un schéma normalisé, votre requête pourrait être:

SELECT s.*
FROM staffs s
JOIN staffs_locations sl ON sl.staff_id = s.id
WHERE sl.location_id = 13;

Et cela renverrait le résultat presque instantanément même avec des millions de lignes (si les index appropriés sont définis).

1
Paul Spiegel 1 mai 2017 à 15:17