Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: GROUP_CONCAT не работает
 
 автор: elenaki   (17.03.2016 в 13:30)   письмо автору
 
 

Есть две таблицы, в failed_phones 22 тыс. строк, в afm_phones больше 8 млн.
Поля - failed_phones.phone и afm_phones.phone, afm_phones.afm.
Надо выбрать все afm_phones.phone, у которых совпадают afm_phones.afm, которые соответствуют failed_phones.phone.
Надо таблицу afm_phones джойнить на саму себя? Пробовала так, ругается на GROUP_CONCAT
(подозреваю, что можно проще)

 SELECT
  afm_phones.phone, afm_phones.afm
  GROUP_CONCAT(
    afm_phones.phone
    
    SEPARATOR ',') AS params
FROM
  afm_phones 
  LEFT JOIN failed_phones
    ON failed_phones.phone = afm_phones.phone
GROUP BY
  failed_phones.phone;


В выборке желательно получить все данные, т.е. и phone из failed_phones и afm и phone из afm_phones. Поле phone везде уникальный индекс.

  Ответить  
 
 автор: Trianon   (18.03.2016 в 12:05)   письмо автору
 
   для: elenaki   (17.03.2016 в 13:30)
 

запятая перед GROUP_CONCAT куда делась?

Если phone в atm_phohes уникально, назначение GROUP_CONCAT (и тем более сепаратора запятой) неясно вообще. Там же набору значений неоткуда будет взяться, и группировка как таковая смысла не несет.

Поле atm ни в одном условии не фигурирует, хотя по описанию - вроде бы должно.

  Ответить  
 
 автор: elenaki   (18.03.2016 в 13:27)   письмо автору
 
   для: Trianon   (18.03.2016 в 12:05)
 

У phone - уникальные значения в обеих таблицах. Но phone из таблицы failed_phones может найтись в таблице afm_phones (скорее всего найдется). Если нашелся, то надо найти второе поле той же записи - afm - в таблице afm_phones. И потом найти все остальные записи в таблице afm_phones с этим же afm. afm - это ИНН. У каждого afm в таблице afm_phones может быть от одного до трехсот телефонов (если это фирма, чаще - два, три, пять). Мне нужно найти телефоны, соoтветствующие afm, один телефон которого уже попал в failed_phones.

PS поставила запятую, сервер задумался. Надо было сначала EXPLAIN написать...

  Ответить  
 
 автор: elenaki   (18.03.2016 в 14:34)   письмо автору
 
   для: elenaki   (18.03.2016 в 13:27)
 

Ограничила вывод 10 значениями. Вывело ерунду. Понятно, что так нельзя - если телефонов много, они не влезут в строку. И они все одинаковые почему-то...


2100037839 | NULL
2100672489 | NULL
2102010845 | 2102010845,2102010845
2102011143 | 2102011143,2102011143
2102011625 | 2102011625
2102012168 | 2102012168,2102012168
2102012575 | 2102012575
2102012942 | 2102012942,2102012942
2102012979 | 2102012979
2102013486 | 2102013486,2102013486,2102013486

  Ответить  
 
 автор: Trianon   (18.03.2016 в 18:53)   письмо автору
 
   для: elenaki   (18.03.2016 в 13:27)
 

Понял. Сейчас попробую что-то подобное нарисовать

SELECT fp.phone,  ap.atm, GROUP_CONCAT(bp.phone SEPAARATOR ',' ) phl
  FROM   failed_phones fp 
     LEFT JOIN  atm_phones ap  ON fp.phone = ap.phone 
        LEFT JOIN atm_phones bp ON bp.atm = ap.atm 
    GROUP BY fp.phone, ap.atm

  Ответить  
 
 автор: elenaki   (22.03.2016 в 12:23)   письмо автору
 
   для: Trianon   (18.03.2016 в 18:53)
 

Не. Не получается. Наверно, сделаю двумя запросами.
1. Найду afm плохих телефонов, их всего 33255.
2. Найду в цикле все остальные телефоны по найденным afm.
Все равно мне их надо вывести как csv, вот и выведу в цикле.

  Ответить  
 
 автор: Trianon   (22.03.2016 в 13:57)   письмо автору
 
   для: elenaki   (22.03.2016 в 12:23)
 

Может тогда лучше эти самые atm в отдельную таблицу положить сперва (на первом шаге) пусть даже и временную?
Все ж таки триста тысяч запросов - не жук чихнул...

  Ответить  
 
 автор: elenaki   (22.03.2016 в 17:52)   письмо автору
 
   для: Trianon   (22.03.2016 в 13:57)
 

Я их положу в csv и буду счиитывать постепенно.

  Ответить  
 
 автор: Trianon   (22.03.2016 в 19:50)   письмо автору
 
   для: elenaki   (22.03.2016 в 17:52)
 

..и с каждой считанной строки формировать SQL-запрос о телефонах.

А можно было бы положить в таблицу, и сопряженные телефоны после этого получить одним запросом.
Уж коль скоро не выходит взять инфу двойным join'ом
Не выходит, если я правильно понимаю, из-за отсутствия индексов по полю atm

Кстати, для построчного чтения необязательно (хотя и весьма удобно) гонять group_concat .
Можно без группировки, одной сортировкой вытянуть те же данные.

  Ответить  
 
 автор: elenaki   (06.04.2016 в 10:26)   письмо автору
 
   для: Trianon   (22.03.2016 в 19:50)
 

Я заполнила поле never_call у тех записей таблицы afm_phones, где есть плохой телефон из таблицы failed_phones.
Теперь выборка должна делаться из одной таблицы - afm_phones.

afm | phone | active | never_call

Все поля - индексы. Кроме того есть уникальный индекс afm+phone.
Надо выбрать все телефоны с одинаковым afm, если один из этих телефонов имеет 1 в поле never_call.
Ушла думать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования