SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.12.2011 22:02:33

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

форматирование данных при SELECTe

Здравствуйте. Возник такой вопрос:
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)

Неактивен

 

#2 10.12.2011 00:56:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: форматирование данных при SELECTe

Посмотрите в сторону replace - замените символ дефиса на пустую строчку.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 10.12.2011 15:46:36

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: форматирование данных при SELECTe

deadka написал:

Посмотрите в сторону replace - замените символ дефиса на пустую строчку.

Спасибо, это почти полностью решило проблему, но если надо помимо дефиса убрать еще и "(", ")" ?
если написать REPLACE (`order`.`customer_phone_num`,'(', '') LIKE '%".$phone."%' OR"
                      REPLACE (`order`.`customer_phone_num`,')', '') LIKE '%".$phone."%' то не получится, т.к. сравнивать будет сначала без одной скобки, а потом без другой, можно как то одновременно убрать их?

Неактивен

 

#4 10.12.2011 22:32:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: форматирование данных при SELECTe

Cделайnt вложенный replace, в которых поудаляйте все что нужно по очереди.
replace(replace(replace...)))


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 13.12.2011 13:06:35

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: форматирование данных при SELECTe

deadka написал:

Cделайnt вложенный replace, в которых поудаляйте все что нужно по очереди.
replace(replace(replace...)))

Большое спасибо, работает.

Неактивен

 

#6 13.12.2011 18:10:05

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: форматирование данных при SELECTe

Есть еще небольшой вопрос. Получился запрос:
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)

Неактивен

 

#7 13.12.2011 18:20:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: форматирование данных при SELECTe

Ваш вариант запроса в-принципе не очень корректный - в других СУБД он может и вовсе не сработать, ну или если 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;
вполне.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 13.12.2011 18:35:29

SanyaGarik
Завсегдатай
Зарегистрирован: 25.10.2011
Сообщений: 26

Re: форматирование данных при SELECTe

но сам вложенный запрос 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)

Неактивен

 

#9 21.12.2011 06:30:13

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: форматирование данных при SELECTe

Возникла такая же проблема с дефисами в телефоне, спасибо за ответ deadka, помогло.

Складывается впечатление, что deadka единственный на этом форуме, кто реально помогает.

Отредактированно seyfer (21.12.2011 06:34:08)

Неактивен

 

#10 21.12.2011 06:48:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: форматирование данных при SELECTe

Да ну что Вы, просто я случайно попадал на Ваши сообщения в нужное время в нужном месте smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 21.12.2011 16:18:43

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: форматирование данных при SELECTe

Ребят, а зачем вы в таблицу суёте данные с лишними символами? Убирайте их перед вставкой номера в БД, а в самой таблице один раз сделайте апдейт с реплейсами, он почистит у вас номера в таблице и тогда не надо будет использовать реплейсы в каждом запросе.
Если эти минусы и прочее надо для красивого отображения номера, как на TurboSMS (реклама big_smile), то делайте это форматирование уже в пхп при выводе, ведь оно надо реже, чем поиск по БД. Таким образом сэкономите время выполнения запросов, место на диске и ресурсы сервера.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson