2017-09-03 1 views
1

Par exemple, permet de dire que dans la colonne source je les entrées suivantesSQL - Sélectionnez toutes les lignes qui ressembles% ...% de l'autre (toutes les lignes similaires)

SourceFileEmbed122 
SourceFile1333 
SourceItem13366 
PreLoadSource7755 

Et je fais une requête de SourceFile il devrait correspondre ligne 1 et 2 et me montrer toutes les données de colonne pour cette ligne, mais si je recherche par exemple: PreLoadSource ou SourceItem il ne devrait rien afficher, car il n'y a qu'une seule ligne qui a une entrée similaire.

Un peu comme s'il y avait quelque chose.

Fondamentalement, je veux faire quelque chose comme: SELECT source, COUNT(*) TotalCount FROM sources GROUP BY source HAVING COUNT(*) > 1 ORDER BY COUNT(*) DESC

Mais la requête ne aime au lieu de LIKE% ...% (comme dans phpMyAdmin) qui se traduit par ce correspondant que les matchs EXACTE de l'autre, de sorte des trucs comme:

row123/ 
row123 

Ne correspondent pas les uns les autres et seront ignorés. Mais je veux que cela CORRESPOND fondamentalement si le texte intégral de row123 est AUSSI tout dans la valeur d'une autre ligne, puis correspond.

Disons que j'ai:

http://link.ext/dir123/file.mp3 
http://link.ext/dir123 
http://link.ext/dir123/file2.mp3 
http://link.ext/dir123 

La requête doit correspondre .../file.mp3, .../file2.mp3 et ../dir123 parce que la ligne 2 http://link.ext/dir123 est également dans la ligne 1, 3 et 4.

+0

voulez-vous dire qu'il affichera uniquement les lignes s'il y a plus d'une correspondance? –

+0

Est-ce vraiment une question sur l'existence de AND et OR dans les requêtes sql? J'espère que je suis malentendu. – deg

+0

@FerdinandGaspar Oui montrer s'il y a plus de 2 et si c'est fondamentalement "contient" la source, Comme fondamentalement je cherche juste à obtenir un vérificateur en double mais un peu mieux car certaines lignes dans ma base de données sont un peu complexes exactement le même article. – user8549339

Répondre

1

une façon est en train de faire une jointure avec la même table, si vous avez besoin d'un compte simple, vous pouvez faire quelque chose comme ça:

SELECT s1.source, COUNT(*) 
FROM sources s1 
INNER JOIN sources s2 
    ON s1.id <> s2.id AND s1.source LIKE CONCAT('%', s2.source, '%') 
GROUP BY s1.source 
+0

au début, vous avez une faute d'orthographe, mais cela fonctionne exactement ce dont j'ai besoin, merci beaucoup :) – user8549339

1

Une façon de tester au moins deux matches est:

select s.* 
from sources s 
where s.source like '%<whatever>%' and 
     exists (select 1 
       from source s2 
       where s2.source like '%<whatever>%' and 
        s2.source <> s.source 
      );