URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8126
[ Назад ]

Исходное сообщение
"Помогите с запросом"

Отправлено Jaivan , 05-Мрт-09 17:14 
Здравствуйте!
Пишу скрипт для работы с базой данных, озадачен вопросом, как можно в констукции
...
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

Помогите реализовать такую штуку )


Содержание

Сообщения в этом обсуждении
"Помогите с запросом"
Отправлено other , 05-Мрт-09 23:21 

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)



"Помогите с запросом"
Отправлено Jaivan , 06-Мрт-09 10:10 
>[оверквотинг удален]
>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
вторая конечно проще для восприятия, но не делает то, что надо


"Помогите с запросом"
Отправлено other , 06-Мрт-09 10:20 
вся фишка тут в order by prefix desc limit 1



"Помогите с запросом"
Отправлено Jaivan , 11-Мрт-09 14:46 
>вся фишка тут в 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
не подскажете как?