Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка полей с одинаковым условием / 7 сообщений из 7, страница 1 из 1
11.11.2013, 05:18:59
    #38459757
ruser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
Добрый день!
Существует таблица пользователей `users`. Сначала было одно поле `phone`, но исторически сложилось так, что появилось еще одно `MPhone`, а потом и еще одно `SMSPhone`.
IDUserMPhoneSMSPhonephone1665965-95-6589111111112891111111131746711-22-3389222222222892222222231795822-22-66893333333332047289444444444894444444448944444444421711null89555555552895555555533148289666666662896666666633429908977777777289777777773
Сейчас с этим возникают определенные неудобства, будем менять структуру, а пока возникла задача:
Есть скрипт для отправки смс, входные параметры - номера, разделенные запятой ($to) и сообщение, нужно найти ID юзеров с этими номерами. На данный момент запрос такой:
Код: sql
1.
SELECT IDUser FROM users WHERE MPhone IN ($to) OR SMSPhone IN ($to) OR phone IN ($to)


Существует вероятность ошибки ER_NET_PACKET_TOO_LARGE (слишком длинный запрос), потому как номеров может быть несколько тысяч, да еще и в запросе они записаны трижды.
Есть два вопроса:
1) Как можно сократить запрос, чтобы не дублировать одинаковое условие?
2) Как непосредственно в запросе узнать, какой номер выбран в сравнении и возможно ли это вообще? Например:
IDUsermatched_phone16659891111111131746789222222222179588933333333331482896666666633429989777777773

Большое спасибо за уделенное время.
...
Рейтинг: 0 / 0
11.11.2013, 06:14:57
    #38459762
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
1)Одним запросом, наверное, никак. Можно так
Код: sql
1.
2.
3.
4.
5.
6.
create temporary table to_table(num int);
insert into to_table values ($to);
SELECT IDUser FROM users 
JOIN to_table t0
ON MPhone=t0.num OR SMSPhone=t0.num OR phone=t0.num;
drop temporary table to_table;

, но должны быть права на создание врем.таблиц + драйвер должен поддерживать multistatement запросы
2)добавить в селект t0.num :)
...
Рейтинг: 0 / 0
11.11.2013, 07:20:24
    #38459785
ruser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
Фокус со временной таблицей не прошел из-за специфики нашего движка, поэтому пришлось выкручиваться (сократить не удалось):
Код: sql
1.
2.
3.
4.
5.
SELECT IDUser, phone FROM (
  SELECT IDUser, MPhone AS phone FROM users WHERE MPhone IN ($to)
  UNION SELECT IDUser, SMSPhone AS phone FROM users WHERE SMSPhone IN ($to)
  UNION SELECT IDUser, phone FROM users WHERE phone IN ($to)
) phones
...
Рейтинг: 0 / 0
11.11.2013, 07:39:35
    #38459797
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
Вот они какие "SMS спамеры" ... ух достали уже! :(

Ну тогда уж так можно сократить длину запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t.IDUser, t.phone
FROM (
    SELECT IDUser, MPhone AS phone FROM users
      UNION
    SELECT IDUser, SMSPhone AS phone FROM users
      UNION
    SELECT IDUser, phone FROM users
) AS t
WHERE t.phone IN ($to)



Вместо удлинения запроса - делаем удлинение таблицы поиска. Если текст запроса не лезет в допустимый пакет, то замедление работы - все-таки меньшее зло. :)
...
Рейтинг: 0 / 0
11.11.2013, 07:50:15
    #38459804
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
Arhat109, это не замедление, это фатальный стопкран :)
Лучше уж тремя запросами, а на клиенте дособирать.
...
Рейтинг: 0 / 0
11.11.2013, 08:27:34
    #38459822
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
ruserФокус со временной таблицей не прошел из-за специфики нашего движкаНе из-за специфики движка, а из-за того, что $to в этом случае должно иметь вид n1),(n2),...,(nK
То есть должна получиться строка
Код: sql
1.
insert into to_table values (n1),(n2),...,(nK);

а не
Код: sql
1.
insert into to_table values (n1,n2,...,nK);
...
Рейтинг: 0 / 0
11.11.2013, 10:38:09
    #38459934
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка полей с одинаковым условием
tanglir,

так "спамеры"... :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка полей с одинаковым условием / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]