Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 25.10.2020, 10:05   #1
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 61
По умолчанию Поиск в MySQL - Требуется, "пройтись" по всей таблице и вывести остальные поля таблицы

Добрый день,

Нужна помощь.

Дано:
Файлик, структура думаю не важна, но для примера строка такая:
Фамилия:Имя:Отчество:Пол:ДатаРожден ия - количество строк в файле около 3000

Есть таблица, количество записей более 270тыс

Требуется, "пройтись" по всей таблице и вывести остальные поля таблицы:

Код:
//Подгрузил файлик
$fio = file('fio.txt', FILE_IGNORE_NEW_LINES);

for ($i = 0; $i < count($fio); $i++) {
    $fio_s=explode(':',$fio[$i]);

    //дата рождения в файле в формате дд.мм.гггг (может просто быть год)в базе гггг-мм-дд 
    if (strpos($fio_s[4], '.') === false) {
        $f_d = $fio_s[4];
    } else {
        $dr = explode ('.',$fio_s[4]);
        $f_d = $dr[2].'-'.$dr[1].'-'.$dr[0];

    }
    $query = "SELECT * FROM person 
              WHERE imya = '$fio_s[1]' 
                AND otchestvo = '$fio_s[2]'
                AND familia = '$fio_s[0]'
                AND data_rojdenya LIKE '%$dr[2]%'";
    $result = mysqli_query($connect, $query); 

   
    if (mysqli_num_rows($result) > 0) {
        $row = mysqli_fetch_assoc($result);
               echo '<tr>';
               echo  '<td>' . $row['imya'] . '</td>';
               echo  '<td>' . $row['otchestvo'] . '</td>';
               echo  '<td>' . $row['familia'] . '</td>';
               echo  '<td>' . $row['pol'] . '</td>';
               echo  '<td>' . $fio_s[4] . '</td>';
               echo  '<td>' . $row['data_rojdenya'] . '</td>';
               echo  '<td>' . $row['ulica'] . '</td>';
               echo  '<td>' . $row['dom'] . '</td>';
               echo  '<td>' . $row['event'] . '</td>';   
               echo '</tr>';
               
    } 
    mysqli_free_result($result);
    
}
Но чего-то очень медленно работает
Помогите советом, как оптимизировать, ускорить.
И будет ли лучше - вначале получить все записи из таблицы, загнать их в массив, а потом уже оттуда вытаскивать согласно файлу?
Завидую крокодилам! Они даже ходят лежа!

Последний раз редактировалось arriah; 25.10.2020 в 10:13.
arriah вне форума Ответить с цитированием
Старый 25.10.2020, 11:24   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 3,707
По умолчанию

1. Почему до через like? Делайте строгое сравнение
2. В бд нужно поля по которым идёт поиск сделать с индексом
ADSoft на форуме Ответить с цитированием
Старый 25.10.2020, 11:27   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 3,707
По умолчанию

+ думаю тут основной тормоз не только в бд, но и в выводе на экран, оно вам нужно? 3000 записей на экране... Сохраняйте результат в файл, а если все же надо на экране - обычно используют пагинацию,ивыводят по 10-20 результатов
ADSoft на форуме Ответить с цитированием
Старый 25.10.2020, 15:27   #4
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 61
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
1. Почему до через like? Делайте строгое сравнение
Ну в файлике дата рождения может состоять только из года, а в базе ГГГГ-ММ-ДД, причем поле имеет тип date - переписал так: AND YEAR(data_rojdenya) = '$dr[2]'

Цитата:
Сообщение от ADSoft Посмотреть сообщение
1. Почему до через like? Делайте строгое сравнение
2. В бд нужно поля по которым идёт поиск сделать с индексом
Спасибо, проиндексировал поля по которым идет поиск, стало веселее.
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Старый 25.10.2020, 15:35   #5
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 61
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
+ думаю тут основной тормоз не только в бд, но и в выводе на экран, оно вам нужно? 3000 записей на экране... Сохраняйте результат в файл, а если все же надо на экране - обычно используют пагинацию,ивыводят по 10-20 результатов
Ну мне пока наглядность нужна, с этим можно смириться на данном этапе, причем из 3000 строк в файлике выводится только лишь 600, которые есть в этой таблице...

И тут у меня возник другой вопрос и одно желание:
Вопрос: В БД данных несколько таблиц с названием person, person2, person_2018? person2_2018
Как они создавались, для чего, ума не приложу. База досталась в наследство. Скорее всего по этой причине в таблице person отсутсвуют люди, которые есть в текстовом файле...
Ну пройтись внаглую по всем таблицам я могу...а вот возможно ли объеденить все эти таблицы в одну, исключая дубликаты записей?
Желание: Я знаю адрес, где живет тот, кто это сделал - хочу оторвать ему руки)
На самом деле я общался с ним, хотел понять логику построения этого всего - но в ответ получил, типа это теперь моя головная боль. Так что придется разбираться самому

В догонку:
В поле dom хранится номер дома. У дома есть корпус, в базе записывается как 22К4, мне надо вывести это в двух полях - дом отдельно, корпус отдельно, как мне разделить строку? через explode? Но я не знаю буква К анг или русская
Завидую крокодилам! Они даже ходят лежа!

Последний раз редактировалось arriah; 25.10.2020 в 15:40.
arriah вне форума Ответить с цитированием
Старый 25.10.2020, 16:08   #6
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 61
По умолчанию

Такс, возникла еще одна проблемка.
Мое заверение о том, что люди не найдены в таблице person - ошибочно
сделал запрос нескольких человек в ручную через phpMyAdmin - они есть в базе, а вот через мой код выше не находятся.
Куда можно посмотреть?

1. Файлик был создан из Excel
2. В код вставил строчку чтобы писал что пользователь не найден, ФИО которое он берет из файла отображается нормально, значит не explode виноват.
3. Кодировка БД latin1, а кодировка таблиц cp1251. Конвертировать в UTF не стал, ибо е и ё юникод видит одинаково и есть поля ключевые с этими буквами В коде указано чтобы mysql отдавала данные в UTF8 - mysqli_set_charset($connect, 'utf8' );

В чем еще может быть причина?
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Старый 25.10.2020, 16:58   #7
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 61
По умолчанию

Спасибо. Разобрался. Причина в дате
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySQL Поиск совпадений в таблице SLOVE251 SQL, базы данных 1 16.11.2017 17:31
Поиск по нескольким словам в таблице mysql bizarre86 PHP 17 06.05.2013 05:05
Поиск по всей таблице непрерывный Cyclops БД в Delphi 1 13.08.2012 12:25
Delphi БД поиск по всей таблицы tanek Помощь студентам 1 21.03.2012 03:50
Как вывести значения поля MySQL в DBLabel, если данные в BLOB... tim21701 Компоненты Delphi 6 20.01.2012 19:39


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя