2010-11-06 22 views
2

MySQL pour correspondre « 12684041234 » au plus long préfixe que vous feriezle plus long préfixe correspondant

SELECT num_prefix 
FROM nums 
WHERE '12684041234' LIKE CONCAT(num_prefix, '%') 
AND LENGTH(num_prefix) = (
    SELECT MAX(LENGTH(num_prefix)) 
    FROM nums 
    WHERE '12684041234' LIKE CONCAT(num_prefix, '%') 
) 

Table nums a une colonne nommée num_prefix avec des valeurs de préfixe.

Comment puis-je le faire dans une ruche?

+0

Je pense que votre requête SQL actuelle n'est pas la plus efficace, car elle nécessitera un scan complet de la table. La performance va-t-elle être un problème? –

+0

@Mark Byers: La performance n'est pas un problème. C'est un travail par lots, la table des préfixes n'est pas grande (quelques centaines), et je peux mettre en cache les résultats si j'ai besoin de – Eyal

Répondre

6

Voici comment je le fais dans MySQL:

SELECT num_prefix FROM nums 
    WHERE '12684041234' LIKE CONCAT(num_prefix,'%') 
    ORDER BY num_prefix DESC 
    LIMIT 1 
; 

Cela vous donnera le plus long préfixe (ORDER BY .. DESC) et une seule rangée (LIMIT 1).

+0

Cela donnera des performances extrêmement médiocres. Cette condition ne peut jamais utiliser un index sur num_prefix, par conséquent cette requête aura toujours besoin d'une analyse de table complète. C'est un peu plus d'effort mais vous pouvez rechercher WHERE num_prefix IN (12684041234,1268404123,126840412,12684041,1268404,126840,12684,1268,126,12,1). – steveayre

+0

Bien que je ne l'ai pas vérifié moi-même, la requête serait approximativement 22 fois plus rapide si vous citez les nombres. O WH num_ préfixe IN ('12684041234', '1268404123', '126840412', '12684041', '1268404', '126840', '12684', '1268', '126', '12', '1') Source: http://wiki.freeswitch.org/wiki/Mod_lcr – steveayre