Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Возник такой вопрос:
SELECT `order`.`numbers`
FROM `order`
WHERE `order`.`numebrs` LIKE '%".$phone."%' "
$phone выбираю в php скрипте, обрезая при этом все "-" и "(", ")" в номере, таким образом номера получаются вида 0987654321, а в базе содержатся номера с "-" и скобками, можно ли средствами mysql в запросе как-то обрезать лишние символы, например если $phone = 0987654321; а в таблице order была запись с строкой 098-765-43-21, то при выполнении запроса эта строка выводилась.
Отредактированно SanyaGarik (09.12.2011 22:08:52)
Неактивен
deadka написал:
Посмотрите в сторону replace - замените символ дефиса на пустую строчку.
Спасибо, это почти полностью решило проблему, но если надо помимо дефиса убрать еще и "(", ")" ?
если написать REPLACE (`order`.`customer_phone_num`,'(', '') LIKE '%".$phone."%' OR"
REPLACE (`order`.`customer_phone_num`,')', '') LIKE '%".$phone."%' то не получится, т.к. сравнивать будет сначала без одной скобки, а потом без другой, можно как то одновременно убрать их?
Неактивен
Cделайnt вложенный replace, в которых поудаляйте все что нужно по очереди.
replace(replace(replace...)))
Неактивен
deadka написал:
Cделайnt вложенный replace, в которых поудаляйте все что нужно по очереди.
replace(replace(replace...)))
Большое спасибо, работает.
Неактивен
Есть еще небольшой вопрос. Получился запрос:
SELECT `order`.`order_tag` , `order`.`product` , `sellers`.`name` AS sname, `order`.`date` , `order`.`amount` , `order`.`price_wholesale` , `order`.`price_retail` , `order`.`paid_to_seller` , `order`.`paid_by_client` , `order`.`commission` , `order`.`delta` , `order`.`delivery_city` , `order`.`customer_name` , `order`.`customer_phone_num` , `order`.`comment` , `order`.`utm_code` , `base_user`.`name` , `ats`.time
FROM `order` , `ats` , `base_user` , `sellers`
WHERE REPLACE( REPLACE( REPLACE( REPLACE( `order`.`customer_phone_num` , '(', '' ) , ' ', '' ) , ')', '' ) , '-', '' ) LIKE '%0633123455%'
AND `order`.`customer_phone_num` = `ats`.`FromNum`
AND `ats`.`InternalNum` = `base_user`.`number`
AND `sellers`.`id` = `order`.`seller_id`
GROUP BY `order`.`id`
Проблема со строкой AND `order`.`customer_phone_num` = `ats`.`FromNum` : в таблице `ats` содержится список всех звонков за несколько месяцев, с самой ранней даты до самой поздней, таким образом этот запрос выбирает самую раннюю запись, можно ли сделать, чтоб выбиралась самая поздняя (другими словами, чтобы таблица перебиралась не с начала, а с конца) или можно только в пхп скрипте обработать?
Пытался написать
AND (select `order`.`customer_phone_num` from `order` where `order`.`customer_phone_num` = `ats`.`FromNum` AND `ats`.`time`= (select max(`ats`.`time`) from `ats`, `order` where `order`.`customer_phone_num` = `ats`.`FromNum`))
но не работает
p.s. CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`manager_id` int(11) NOT NULL,
`seller_id` int(11) NOT NULL,
`order_tag` varchar(100) NOT NULL,
`product` varchar(127) NOT NULL,
`price_wholesale` decimal(7,2) NOT NULL,
`price_retail` decimal(7,2) NOT NULL,
`amount` int(11) NOT NULL,
`order_wholesale` decimal(7,2) NOT NULL,
`order_retail` decimal(7,2) NOT NULL,
`paid_to_seller` decimal(7,2) NOT NULL,
`paid_by_client` decimal(7,2) NOT NULL,
`commission` decimal(7,2) NOT NULL,
`customer_name` varchar(100) NOT NULL,
`customer_phone_num` varchar(64) NOT NULL,
`delivery_city` varchar(127) NOT NULL,
`delivery_address` varchar(255) NOT NULL,
`comment` text NOT NULL,
`status` enum('Yes','No') NOT NULL,
`delta` decimal(7,2) NOT NULL,
`date` datetime NOT NULL,
`delivery_method` varchar(128) NOT NULL,
`payment_method` varchar(128) NOT NULL,
`delivery_expected_date` date NOT NULL,
`delivery_expected_time` varchar(128) NOT NULL,
`utm_code` int(11) NOT NULL,
`date_pay_seller` datetime NOT NULL,
`date_pay_client` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1451 DEFAULT CHARSET=utf8
CREATE TABLE `ats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`FromNum` text NOT NULL,
`ToNum` text NOT NULL,
`InternalNum` int(11) NOT NULL,
`time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1070 DEFAULT CHARSET=utf8
Отредактированно SanyaGarik (13.12.2011 18:18:42)
Неактивен
Ваш вариант запроса в-принципе не очень корректный - в других СУБД он может и вовсе не сработать, ну или если sql-mode построже включить.
Дело в том, что если Вы группируете по order.id, то при выборе остальных столбцов нужно указывать группирующую функцию.
Пример:
Есть таблица t, содержащая категории и товары - точнее принадлежность товара к категории.
cat_id good_id
1 2
1 3
1 1
2 4
2 2
2 3
Если Вы группируете по cat_id, то нужно указать способ группировки good_id
то есть вот так (похожим образом Вы делаете)
select cat_id,good_id from t group by cat_id;
делать не надо
А так
select cat_id,max(good_id) from t group by cat_id;
или
select cat_id,min(good_id) from t group by cat_id;
вполне.
Неактивен
но сам вложенный запрос AND (select `order`.`customer_phone_num` from `order` where `order`.`customer_phone_num` = `ats`.`FromNum` AND `ats`.`time`= (select max(`ats`.`time`) from `ats`, `order` where `order`.`customer_phone_num` = `ats`.`FromNum`group by `order`.`id` )) некорректно работает, хотя, скорее всего, я Вас неправильно понял, и зам вложенный запрос неправильный у меня, может его как-то преобразовать можно?
Если, например, такой запрос
SELECT `ats`.`id` , `ats`.`InternalNum` , MAX( `ats`.`time` ) AS TIME
FROM `ats` , `base_user`
WHERE `ats`.`FromNum` LIKE '%0633149111%'
GROUP BY `time`
выводит
id InternalNum time
23 200 1312209469
24 203 1323782520
без group by:
id InternalNum TIME
23 200 1323782520
(дата правильная, первые 2 столбца выбираются из первой строки почему то)
Как мне сделать, чтобы этот запрос выводил просто
24 203 1323782520
В базе содержатся записи:
id FromNum InternalNum time
23 0633149111 200 1312209469
24 0633149111 203 1323782520
p.s. решил проблему- написал такой запрос
SELECT `order`.`order_tag`, `order`.`product`, `sellers`.`name` AS sname, `order`.`date`, `order`.`amount`, `order`.`price_wholesale`,
`order`.`price_retail`, `order`.`paid_to_seller`, `order`.`paid_by_client`, `order`.`commission`, `order`.`delta`, `order`.`delivery_city`,
`order`.`customer_name`, `order`.`customer_phone_num`, `order`.`comment`, `order`.`utm_code`, `base_user`.`name`,
(select max(`ats`.`time`) from `ats`)
FROM `order` , `ats`, `base_user`, `sellers`
WHERE REPLACE ( REPLACE( REPLACE( REPLACE(`order`.`customer_phone_num`,'(', ''), ' ', ''), ')', '' ) ,'-', '') LIKE '%0633149111%'
AND `order`.`customer_phone_num`= `ats`.`FromNum`
AND `base_user`.`number` =
(select `ats`.`InternalNum`
FROM `ats` , `base_user`
WHERE `ats`.`FromNum` LIKE '%0633149111%'
GROUP BY `ats`.`id`
ORDER BY `ats`.`time` DESC
LIMIT 1)
AND `sellers`.`id`= `order`.`seller_id`
GROUP BY `order`.`id`
Отредактированно SanyaGarik (13.12.2011 20:17:10)
Неактивен
Возникла такая же проблема с дефисами в телефоне, спасибо за ответ deadka, помогло.
Складывается впечатление, что deadka единственный на этом форуме, кто реально помогает.
Отредактированно seyfer (21.12.2011 06:34:08)
Неактивен
Да ну что Вы, просто я случайно попадал на Ваши сообщения в нужное время в нужном месте .
Неактивен
Ребят, а зачем вы в таблицу суёте данные с лишними символами? Убирайте их перед вставкой номера в БД, а в самой таблице один раз сделайте апдейт с реплейсами, он почистит у вас номера в таблице и тогда не надо будет использовать реплейсы в каждом запросе.
Если эти минусы и прочее надо для красивого отображения номера, как на TurboSMS (реклама ), то делайте это форматирование уже в пхп при выводе, ведь оно надо реже, чем поиск по БД. Таким образом сэкономите время выполнения запросов, место на диске и ресурсы сервера.
Неактивен