Здравствуйте!
Пишу скрипт для работы с базой данных, озадачен вопросом, как можно в констукции
...
WHERE CAST(field1 AS CHAR) LIKE CONCAT(CAST(field2 AS CHAR), '%')
...реализовать выборку по наибольшему совпадению начальных символов поля field1 из множества строк, получающихся из конструкции CONCAT(CAST(field2 AS CHAR), '%')
пример, для понимания:
есть 3 направления1 страна1
12 страна2
123 страна3при звонке на номер 123ххххххх тарификация должна осуществляться по стране3
Помогите реализовать такую штуку )
mysql> select * from test;
+----+--------+
| id | prefix |
+----+--------+
| 1 | 1 |
| 2 | 12 |
| 3 | 123 |
| 4 | 1234 |
| 5 | 12345 |
+----+--------+
5 rows in set (0.00 sec)mysql> select * from test where left('1288977324324212', length(prefix)) = prefix order by prefix desc limit 1;
+----+--------+
| id | prefix |
+----+--------+
| 2 | 12 |
+----+--------+
1 row in set (0.00 sec)mysql> select * from test where left('12388977324324212', length(prefix)) = prefix order by prefix desc limit 1;
+----+--------+
| id | prefix |
+----+--------+
| 3 | 123 |
+----+--------+
1 row in set (0.00 sec)mysql> select * from test where left('123488977324324212', length(prefix)) = prefix order by prefix desc limit 1;
+----+--------+
| id | prefix |
+----+--------+
| 4 | 1234 |
+----+--------+
1 row in set (0.00 sec)
>[оверквотинг удален]
>1 row in set (0.00 sec)
>
>mysql> select * from test where left('123488977324324212', length(prefix)) = prefix order by prefix desc limit 1;
>+----+--------+
>| id | prefix |
>+----+--------+
>| 4 | 1234 |
>+----+--------+
>1 row in set (0.00 sec)
>
выборка идентичная получается что так:
WHERE CAST(field1 AS CHAR) LIKE CONCAT(CAST(field2 AS CHAR), '%')
что так:
WHERE LEFT(tel1, length(countryid)) = countryid
вторая конечно проще для восприятия, но не делает то, что надо
вся фишка тут в order by prefix desc limit 1
>вся фишка тут в order by prefix desc limit 1мне эта фишка совсем не нужна как бы )))
вот, что надо:
SELECT c.dt,
c.klient,
c.tel1,
b.country,
b.countryid,
b.costout,
ROUND(c.dur, 0) AS dur,
ROUND((c.dur/60*b.costout), 5) AS Summa
FROM
bil b
INNER JOIN cdr c ON c.tel1 LIKE CONCAT(b.countryid, '%')
LEFT JOIN bil bi ON
bi.countryid != b.countryid
AND LENGTH(bi.countryid) > LENGTH(b.countryid)
AND c.tel1 LIKE CONCAT(bi.countryid, '%')
WHERE bi.countryid IS NULL
ORDER BY c.dtтолько еще сделать итоги по ROUND(c.dur, 0) AS dur и ROUND((c.dur/60*b.costout), 5) AS Summa
не подскажете как?