Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
max_on1370
0 / 0 / 0
Регистрация: 21.07.2017
Сообщений: 4
1

Выборка из нескольких баз данных (один сервер)

28.01.2018, 13:48. Просмотров 909. Ответов 5
Метки нет (Все метки)

Добрый день, возникла проблема, нужно выбрать данные (структура таблиц на выходе одинаковая) из двух БД на одном сервере, решил сначала протестировать с sql запросом в phpmyadmin, запрос выглядит так:
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT time, CONCAT( person.last_name, ' ',SUBSTR(person.name,1,1), '.' ,SUBSTR(person.middle_name,1,1), '.') AS fio, odd, person.name AS imya, person.middle_name AS fam, person.last_name AS otch , days.day, subject.name AS predmet, nedelya.ned, groups.name AS groop, class.number AS class, schedule.id_class, sub_group, schedule.day AS den, schedule.odd AS chet, schedule.id FROM `uni-ugresha_colportal`.schedule 
INNER JOIN days ON days.id = schedule.day 
INNER JOIN class ON class.id = schedule.id_class 
INNER JOIN person ON person.id = schedule.id_teacher 
INNER JOIN nedelya ON nedelya.id = schedule.odd 
INNER JOIN subject ON subject.id = schedule.id_subject 
INNER JOIN groups ON groups.id = schedule.id_group 
WHERE class.number = 309 
UNION ALL 
SELECT time, CONCAT( person.last_name, ' ',SUBSTR(person.name,1,1), '.' ,SUBSTR(person.middle_name,1,1), '.') AS fio, odd, person.name AS imya, person.middle_name AS fam, person.last_name AS otch , days.day, subject.name AS predmet, nedelya.ned, groups.name AS groop, class.number AS class, schedule.id_class, sub_group, schedule.day AS den, schedule.odd AS chet, schedule.id FROM `uni-ugresha_portal`.schedule 
INNER JOIN days ON days.id = schedule.day 
INNER JOIN class ON class.id = schedule.id_class 
INNER JOIN person ON person.id = schedule.id_teacher 
INNER JOIN nedelya ON nedelya.id = schedule.odd 
INNER JOIN subject ON subject.id = schedule.id_subject 
INNER JOIN groups ON groups.id = schedule.id_group 
WHERE class.number = 309
Если выполнять их отдельно всё нормально, делается выборка, если выполнять вместе, то коннектится к последней бд из запроса и делает выборку только по ней, пробовал просто делать выборку, полную, двух таблиц в разных бд, результат нормальный, возможно дело в подстановках, просто в конечно итоге нужно объединить две выборки и отсортировать их по 4 параметрам последовательно
MySQL
1
ORDER BY  schedule.time ASC, schedule.day,schedule.odd, schedule.sub_group
, если проще будет отсортировать массив строк в php, то можете подсказать как это сделать, так как читал много информации, но толком ничего не понял, получится ли адекватная сортировка такого массива
Запрос на выборку из одной бд в php выглядит так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$query = mysqli_query($connect," SELECT time, CONCAT(  person.last_name, ' ',SUBSTR(person.name,1,1), '.' ,SUBSTR(person.middle_name,1,1), '.') AS fio, odd, days.day, subject.name AS predmet, nedelya.ned, groups.name AS groop, class.number AS class, schedule.id_class, sub_group, schedule.day AS den, schedule.odd AS chet  FROM  schedule
    INNER JOIN days ON days.id = schedule.day  
    INNER JOIN class ON class.id = schedule.id_class 
    INNER JOIN person ON person.id = schedule.id_teacher
    INNER JOIN nedelya  ON nedelya.id = schedule.odd 
    INNER JOIN subject ON subject.id =  schedule.id_subject
    INNER JOIN groups ON groups.id =  schedule.id_group
    WHERE class.number LIKE '%" . $_GET['cab'] . "%' 
    ORDER BY  schedule.time ASC, schedule.day,schedule.odd, schedule.sub_group");
    $posts = array();
    if ($query){
        while($row = mysqli_fetch_assoc($query)) {
            $posts[] = $row;
        }
    }
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2018, 13:48
Ответы с готовыми решениями:

Выборка из двух баз данных
Доброе утро, подскажите пожалуйста что не так. Есть страница редактирования товара, конкретный...

Один сайт и 100 баз данных
Здравствуйте уважаемые коллеги! Вопрос к профессионалам. Работаю в туристической компании...

Выборка из нескольких баз
Всем бодрого :). Помогите, пожалуста, составить запрос по имеющейся задачи. имеем несколько...

Сводная Выборка Из Нескольких Баз.
Подскажите методику для реализации задачи. Есть несколько баз с одинаковым дизайном, нужно в...

Технология создания приложений на основе многоуревневой архитектуры клиент - Web-сервер - сервер баз данных
Технология создания приложений на основе многоуревневой архитектуры клиент Web-сервер – сервер...

5
EU1CJ
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
31.01.2018, 20:20 2
Лучший ответ Сообщение было отмечено max_on1370 как решение

Решение

Так Ваш запрос и будет коннектится только к последней базе.
У вас в первой части UNION, например строки №1,2
MySQL
1
2
SELECT time, CONCAT( person.last_name, ' ',SUBSTR(person.name,1,1),...
INNER JOIN days ON days.id = schedule.day
и вторая часть UNION, строки №10,11
MySQL
1
2
SELECT time, CONCAT( person.last_name, ' ',SUBSTR(person.name,1,1),...
INNER JOIN days ON days.id = schedule.day
полностью одинаковые (кроме конца строк 1 и 10).
MySQL не знает из каких таблиц какой базы всё это брать, вот и берёт из последней. Так как сам запрос начинает обрабатываться с конца. Сначала рассматриваются условия, типа where и т.д. а потом выполняется выборка.
Поэтому, чтобы заработало, явно указывайте ЧТО и ОТКУДА MySQL должен брать. Хотя бы в одной из частей UNION
Т.е. что-то типа:
MySQL
1
2
3
4
5
6
7
8
9
SELECT `uni-ugresha_colportal`.`schedule`.time, CONCAT( `uni-ugresha_colportal`.person.last_name, ' ',SUBSTR(`uni-ugresha_colportal`.person.name,1,1),...
INNER JOIN `uni-ugresha_colportal`.days ON `uni-ugresha_colportal`.days.id = `uni-ugresha_colportal`.schedule.day
.....
WHERE `uni-ugresha_colportal`.class.number = 309
UNION ALL
SELECT time, CONCAT( person.last_name, ' ',SUBSTR(person.name,1,1),...
INNER JOIN days ON days.id = schedule.day
.....
WHERE class.number = 309
И это если у Вас активно соединение ко второй базе. В идеале лучше сделать в обеих частях UNION.
Длинно, конечно. Тогда используйте aliases.

Добавлено через 13 минут
Да, и по поводу сортировки.
Используйте ORDER BY прямо в запросе, в чём проблема.
Причём можно один на весь UNION, в самом конце напишите что-то как:
MySQL
1
2
WHERE class.number = 309
ORDER BY time ASC, -- и список колонок
Только учтите, что в этом варианте MySQL не воспринимает имена таблиц (когда общий ORDER на весь UNION), поэтому опять же два варианта:
- или без table names
- или с ними, но сделать это для каждой из частей union запроса.

Короче говоря, с order потестируйте сами в phpmyadmin.
1
max_on1370
0 / 0 / 0
Регистрация: 21.07.2017
Сообщений: 4
01.02.2018, 00:08  [ТС] 3
Спасибо большое, суть понял, с сортировкой проблем не будет главное что бы выборка нормально сделалась, но вот по поводу явного указывается, вроде пробовал такой вариант, в каждом запросе прописывать перед таблицами имя бд, попробую конечно ещё раз, как раз завтра после работы
0
EU1CJ
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
01.02.2018, 00:23 4
Рад помочь.. Сообщите, если что не так.
Главное, чтоб работало ))
0
max_on1370
0 / 0 / 0
Регистрация: 21.07.2017
Сообщений: 4
02.02.2018, 01:58  [ТС] 5
Спасибо ещё раз, похоже когда я до этого пытался использовать явное указываете что-то пропустил, теперь всё нормально работает, итог работы: Расписание по кабинетам , теперь хотя бы можно смотреть наложение расписания по кабинетам
0
EU1CJ
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
02.02.2018, 08:04 6
Не за что. Обращайтесь.

P.S. Красивое расписание получилось
0
02.02.2018, 08:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2018, 08:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Выборка значений из нескольких столбцов в один
Доброго, имеется таблица: id, rights rights может быть 1, 2, 3, 4, 5. Как выбрать только те...

Выборка таблиц из двух разных баз данных
Добрый день, опять обращаюсь к Вам за помощью, заранее благодарю. Проблема в запросе на выборку...

Выборка данных из трех баз в одну независимую
Добрый день Нужна помощь Есть три запроса: SELECT * FROM catalog_1 WHERE (`id`=12) SELECT *...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.