Étant donné une requête mysql sous la forme suivante:

SELECT *
FROM table
WHERE field1 LIKE '%foo%'
    OR field2 LIKE '%bar%'
    OR field3 LIKE '%foobar%'

Quelle est la meilleure façon de marquer les "champs correspondants"?

Par exemple:

+----+--------+--------+----------+
| ID | field1 | field2 |  field3  |
+----+--------+--------+----------+
| 01 |   foo  |   xxx  |    xxx   |
+----+--------+--------+----------+
| 02 |   xxx  |12bar21 |xxfoobarxx|
+----+--------+--------+----------+
| 03 |   f2o  |   bar  |    yxz   |
+----+--------+--------+----------+

Ici, chaque enregistrement serait mis en correspondance - maintenant je veux savoir quel champ pour chaque enregistrement correspond. (Donc pour l'ID 01 c'est field1, pour l'ID 02 c'est field2, field3 et pour l'ID 03 c'est field2)

Je vous remercie

0
Simon Aschemeier 20 nov. 2018 à 07:43

3 réponses

Meilleure réponse

Vous pouvez ajouter des indicateurs en utilisant des conditions à votre sélection comme:

SELECT *,
    IF(field1 LIKE '%foo%', 1, 0) AS field1_matches,
    IF(field2 LIKE '%bar%', 1, 0) AS field2_matches,
    IF(field3 LIKE '%foobar%', 1, 0) AS field3_matches
FROM TABLE
WHERE field1 LIKE '%foo%'
    OR field2 LIKE '%bar%'
    OR field3 LIKE '%foobar%'

Si vous avez besoin des résultats dans un seul champ sous forme de liste séparée par des virgules, vous pouvez concaténer les résultats en utilisant CONCAT_WS et renvoyer NULL dans votre conditionnel lorsqu'il n'y a pas de correspondance:

SELECT *,
    CONCAT_WS(',',
        IF(field1 LIKE '%foo%', 'field1', NULL),
        IF(field2 LIKE '%bar%', 'field2', NULL),
        IF(field3 LIKE '%foobar%', 'field3', NULL)
    ) AS matches
FROM TABLE
WHERE field1 LIKE '%foo%'
    OR field2 LIKE '%bar%'
    OR field3 LIKE '%foobar%'
1
billynoah 20 nov. 2018 à 05:15

Et une expression CASE:

SELECT
    CASE WHEN field1 REGEXP '[[:<:]]foo[[:>:]]|[[:<:]]bar[[:>:]]|[[:<:]]foobar[[:>:]]'
         THEN 'field1' ELSE '' END AS field1match,
    CASE WHEN field2 REGEXP '[[:<:]]foo[[:>:]]|[[:<:]]bar[[:>:]]|[[:<:]]foobar[[:>:]]'
         THEN 'field2' ELSE '' END AS field2match,
    CASE WHEN field3 REGEXP '[[:<:]]foo[[:>:]]|[[:<:]]bar[[:>:]]|[[:<:]]foobar[[:>:]]'
         THEN 'field3' ELSE '' END AS field3match
FROM yourTable

Démo

Si vous souhaitez simplement faire correspondre des sous-chaînes, utilisez ceci:

SELECT
    CASE WHEN field1 REGEXP 'foo|bar|foobar'
         THEN 'field1' ELSE '' END AS field1match,
    CASE WHEN field2 REGEXP 'foo|bar|foobar'
         THEN 'field2' ELSE '' END AS field2match,
    CASE WHEN field3 REGEXP 'foo|bar|foobar'
         THEN 'field3' ELSE '' END AS field3match
FROM yourTable
0
Tim Biegeleisen 20 nov. 2018 à 05:14

Utilisation de CONCAT et CASE

Vous recherchez exactement le résultat ci-dessous, mais je sais que vous souhaitez séparer les champs par une virgule ou tout autre signe, pour cela, je ne peux pas accéder mysql maintenant, donc je pense que vous pouvez gérer cela par vous-même

SELECT *,
    CONCAT(CASE WHEN field1 LIKE '%foo%' THEN 'field1' ELSE NULL END,
            CASE WHEN field2 LIKE '%bar%' THEN 'field2' ELSE NULL END,
            CASE WHEN field3 LIKE '%foobar%' THEN 'field3' ELSE NULL END) AS macthed_column
FROM youtable
WHERE field1 LIKE '%foo%'
    OR field2 LIKE '%bar%'
    OR field3 LIKE '%foobar%'

SORTIE :

ID  field1  field2  field3      macthed_column
1   foo     xxx     xxx         field1
2   xxx     12bar21 xxfoobarxx  field2field3
3   f2o     bar     yxz         field2
0
Susang 20 nov. 2018 à 06:00