Привет господа, прошу помощи с составлением корректного запроса У меня есть три таблицы Город, Магазины, График работы В таблице Магазины есть столбец Город_id. по этому полю я получаю названия городов из таблицы Город . На данный момент есть вот такой рабочий запрос Код (Text): SELECT Магазины.id, Магазины.adress, Город.city FROM Магазины, Город WHERE Город.id = Магазины.Город_id Также в таблице Магазины есть столбец id, по нему в таблице График работы из колонки Магазин_id я получаю дни работы магазина и график на конкретный день. Структура График работы таблицы следующая: id | Магазин_id | День | Начало | Конец ------------------------------------------------------------------------- 1 | 4567 | 1 | 8.00 | 9.00 ------------------------------------------------------------------------- 2 | 4567 | 2 | 8.00 | 9.00 ------------------------------------------------------------------------- 3 | 4567 | 3 | 8.00 | 9.00 ------------------------------------------------------------------------- 4 | 4567 | 4 | 8.00 | 9.00 ------------------------------------------------------------------------- 5 | 4567 | 5 | 8.00 | 9.00 ------------------------------------------------------------------------- 6 | 4567 | 6 | 8.00 | 9.00 ------------------------------------------------------------------------- 7 | 4567 | 7 | 8.00 | 9.00 Делаю вот такой запрос на выборку: Код (Text): SELECT Магазины.id, Магазины.adress, Город.city, График.День, График.Начало, График.конец FROM Магазины, Город, График WHERE Город.id = Магазины.Город_id AND График.Магазин_id = Магазин.id Но при таком запросе получается не корректный вывод количества записей (их должно быть столько же сколько создано магазинов с таблице Магазины. Но из-за того что в таблице График для каждого магазина есть 7 полей с одинаковым кодом магазина на каждый день то количество выведенных строк намного больше существующих магазинов. В итоге должно получится вывод циклом всех магазинов + к каждому магазину вывод циклом графика работы. Кто дочитал, прошу о помощи. Спасибо)
@mainprofilemail Код (Text): SELECT shop.id AS shop_id, shop.adress AS shop_adress, сity.city, graph.День AS graph_day, graph.Начало AS graph_start, graph.конец AS graph_end FROM 'Магазины' AS shop LEFT JOIN 'Город' AS сity ON сity.id = shop.Город_id LEFT JOIN 'График' AS graph ON graph.id = shop.Город_id
Запрос работает, спасибо. Но вот только проблема осталась таже, выводит количество магазинов * 7. получается что в каждом массиве храниться график только за один день. можно ли сделать одним запросом что бы выводился основной массив с магазинами и под массив с графиками? Или это уже нужно обрабатывать текущие полученные массивы и исключать повторение магазинов при выводе?
Основная таблица магазинов, а вспомогательная графиков и городов. Можете пример показать пожалуйста, а то я с такими запросами еще не работал и не знаю как они правильно строятся
@mainprofilemail Вопрос, вот у вас например Магазин_1 . Что должно вывестись из таблицы График для этого магазина, из тех семи что там есть? Ответ я знаю, но все же, чтоб вы своей головой доперли, и сказали программе что вывести. Код (Text): DAYNAME()
Должно вывестись все 7 строк с данными из вот этих колонок (day, startTime, endTime) для этого магазина, так как каждая строка отвечает за определенный день недели. Сейчас получается вот так: PHP: Array ( [shop_id] => 14 [shop_adress] => вул. Київська 546 [city] => Київ [day] => Пн. [startTime] => 01:00:00 [endTime] => 02:00:00 ) Array ( [shop_id] => 14 [shop_adress] => вул. Київська 546 [city] => Київ [day] => Вт. [startTime] => 03:00:00 [endTime] => 04:00:00 ) ; А нужно что-то вроде: PHP: Array ( [shop_id] => 14 [shop_adress] => вул. Київська 546 [city] => Київ [graph] => [ [ [day] = 'Пн.' [startTime] => 01:00:00 [endTime] => 02:00:00 ], [ [day] = 'Вт.' [startTime] => 03:00:00 [endTime] => 04:00:00 ] ] ) Только массив на выходе должен содержать все магазины, а не один как я показал.
Смысл в этом такой чтобы я мог вывести циклом список всех магазинов и внутри вложенным циклом вывести график работы всех дней недели конкретного магазина. Делать два запроса, а потом соединять массивы не хочется, вот и думал как это все вывести одним запросом. --- Добавлено --- Либо получается нужно разделять уже имеющие массивы и вытягивать от туда график, и уж потом липить к конкретному магазину, так как не хочется чтобы магазины в списке повторялись
@mainprofilemail ждешь таки что за тебя сделали, эх ты PHP: <?php $test = [ [ 'shop_id' => 14, 'shop_adress' => 'вул. Київська 546', 'city' => 'Київ', 'day' => 'Пн.', 'startTime' => '01:00:00', 'endTime' => '02:00:00', ], [ 'shop_id' => 14, 'shop_adress' => 'вул. Київська 546', 'city' => 'Київ', 'day' => 'Вт.', 'startTime' => '03:00:00', 'endTime' => '04:00:00', ], [ 'shop_id' => 14, 'shop_adress' => 'вул. Київська 546', 'city' => 'Київ', 'day' => 'Вт.', 'startTime' => '03:00:00', 'endTime' => '04:00:00', ], [ 'shop_id' => 14, 'shop_adress' => 'вул. Київська 546', 'city' => 'Київ', 'day' => 'Ср.', 'startTime' => '05:00:00', 'endTime' => '07:00:00', ], [ 'shop_id' => 15, 'shop_adress' => 'вул. Київська 546', 'city' => 'Київ', 'day' => 'Пн.', 'startTime' => '02:00:00', 'endTime' => '03:00:00', ], [ 'shop_id' => 15, 'shop_adress' => 'вул. Київська 546', 'city' => 'Київ', 'day' => 'Вс.', 'startTime' => '00:00:00', 'endTime' => '08:00:00', ], ]; $result = []; foreach( $test as $val ) { $shop_id = $val['shop_id']; $shop_adress = $val['shop_adress']; $city = $val['city']; $day = $val['day']; $startTime = $val['startTime']; $endTime = $val['endTime']; if( !isset( $result[$shop_id] ) ) { $result[$shop_id] = [ 'shop_id' => $shop_id, 'shop_adress' => $shop_adress, 'city' => $city ]; } $result[ $shop_id ]['graph'][] = [ 'day' => $day, 'startTime' => $startTime, 'endTime' => $endTime, ]; } print_r( $result );
Ни в коем случае не ждал пока сделают вместо меня. Просто думал что есть вариант получения данных в таком формате без обработки. Но за решение спасибо)