За последние 24 часа нас посетили 21470 программистов и 1023 робота. Сейчас ищут 724 программиста ...

SELECT + Сложные таблицы

Тема в разделе "MySQL", создана пользователем mainprofilemail, 21 май 2020.

  1. mainprofilemail

    mainprofilemail Активный пользователь

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Привет господа, прошу помощи с составлением корректного запроса;)

    У меня есть три таблицы Город, Магазины, График работы

    В таблице Магазины есть столбец Город_id. по этому полю я получаю названия городов из таблицы Город .

    На данный момент есть вот такой рабочий запрос

    Код (Text):
    1. 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):
    1. SELECT Магазины.id, Магазины.adress, Город.city, График.День, График.Начало, График.конец FROM Магазины, Город, График WHERE Город.id = Магазины.Город_id AND График.Магазин_id = Магазин.id
    Но при таком запросе получается не корректный вывод количества записей (их должно быть столько же сколько создано магазинов с таблице Магазины. Но из-за того что в таблице График для каждого магазина есть 7 полей с одинаковым кодом магазина на каждый день то количество выведенных строк намного больше существующих магазинов.

    В итоге должно получится вывод циклом всех магазинов + к каждому магазину вывод циклом графика работы.

    Кто дочитал, прошу о помощи. ;) Спасибо)
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mainprofilemail
    Код (Text):
    1. SELECT shop.id AS shop_id,
    2.     shop.adress AS shop_adress,
    3.     сity.city,
    4.     graph.День AS graph_day,
    5.     graph.Начало AS graph_start,
    6.     graph.конец AS graph_end
    7. FROM 'Магазины' AS shop
    8. LEFT JOIN 'Город' AS сity ON сity.id = shop.Город_id
    9. LEFT JOIN 'График' AS graph ON graph.id = shop.Город_id
     
    mainprofilemail нравится это.
  3. mainprofilemail

    mainprofilemail Активный пользователь

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2

    Запрос работает, спасибо. Но вот только проблема осталась таже, выводит количество магазинов * 7. получается что в каждом массиве храниться график только за один день. можно ли сделать одним запросом что бы выводился основной массив с магазинами и под массив с графиками?

    Или это уже нужно обрабатывать текущие полученные массивы и исключать повторение магазинов при выводе?
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    условие WHERE добавить. Что вы там считаете основным, а что нет, я не в курсе.
     
  5. mainprofilemail

    mainprofilemail Активный пользователь

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Основная таблица магазинов, а вспомогательная графиков и городов.

    Можете пример показать пожалуйста, а то я с такими запросами еще не работал и не знаю как они правильно строятся
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mainprofilemail Вопрос, вот у вас например Магазин_1 . Что должно вывестись из таблицы График для этого магазина, из тех семи что там есть?
    Ответ я знаю, но все же, чтоб вы своей головой доперли, и сказали программе что вывести.
    Код (Text):
    1. DAYNAME()
     
  7. mainprofilemail

    mainprofilemail Активный пользователь

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Должно вывестись все 7 строк с данными из вот этих колонок (day, startTime, endTime) для этого магазина, так как каждая строка отвечает за определенный день недели.

    Сейчас получается вот так:
    PHP:
    1. (
    2.     [shop_id] => 14
    3.     [shop_adress] => вул. Київська 546
    4.     [city] => Київ
    5.     [day] => Пн.
    6.     [startTime] => 01:00:00
    7.     [endTime] => 02:00:00
    8. )
    9.                
    10. (
    11.     [shop_id] => 14
    12.     [shop_adress] => вул. Київська 546
    13.     [city] => Київ
    14.     [day] => Вт.
    15.     [startTime] => 03:00:00
    16.     [endTime] => 04:00:00
    17. )
    18. ;
    А нужно что-то вроде:
    PHP:
    1. (
    2.     [shop_id] => 14
    3.     [shop_adress] => вул. Київська 546
    4.     [city] => Київ
    5.     [graph] => [
    6.                 [
    7.                     [day] = 'Пн.'
    8.                     [startTime] => 01:00:00
    9.                     [endTime] => 02:00:00
    10.                 ],
    11.                 [
    12.                     [day] = 'Вт.'
    13.                     [startTime] => 03:00:00
    14.                     [endTime] => 04:00:00
    15.                 ]
    16.             ]
    17. )
    Только массив на выходе должен содержать все магазины, а не один как я показал.
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А смысл в этом какой? Суньте ручками. через sql никак.
     
  9. mainprofilemail

    mainprofilemail Активный пользователь

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Смысл в этом такой чтобы я мог вывести циклом список всех магазинов и внутри вложенным циклом вывести график работы всех дней недели конкретного магазина.

    Делать два запроса, а потом соединять массивы не хочется, вот и думал как это все вывести одним запросом.
    --- Добавлено ---
    Либо получается нужно разделять уже имеющие массивы и вытягивать от туда график, и уж потом липить к конкретному магазину, так как не хочется чтобы магазины в списке повторялись
     
  10. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mainprofilemail ждешь таки что за тебя сделали, эх ты
    PHP:
    1. <?php
    2. $test = [
    3.     [
    4.         'shop_id' => 14,
    5.         'shop_adress' => 'вул. Київська 546',
    6.         'city' => 'Київ',
    7.         'day' => 'Пн.',
    8.         'startTime' => '01:00:00',
    9.         'endTime' => '02:00:00',
    10.     ],
    11.     [
    12.         'shop_id' => 14,
    13.         'shop_adress' => 'вул. Київська 546',
    14.         'city' => 'Київ',
    15.         'day' => 'Вт.',
    16.         'startTime' => '03:00:00',
    17.         'endTime' => '04:00:00',
    18.     ],
    19.     [
    20.         'shop_id' => 14,
    21.         'shop_adress' => 'вул. Київська 546',
    22.         'city' => 'Київ',
    23.         'day' => 'Вт.',
    24.         'startTime' => '03:00:00',
    25.         'endTime' => '04:00:00',
    26.     ],
    27.     [
    28.         'shop_id' => 14,
    29.         'shop_adress' => 'вул. Київська 546',
    30.         'city' => 'Київ',
    31.         'day' => 'Ср.',
    32.         'startTime' => '05:00:00',
    33.         'endTime' => '07:00:00',
    34.     ],
    35.     [
    36.         'shop_id' => 15,
    37.         'shop_adress' => 'вул. Київська 546',
    38.         'city' => 'Київ',
    39.         'day' => 'Пн.',
    40.         'startTime' => '02:00:00',
    41.         'endTime' => '03:00:00',
    42.     ],
    43.     [
    44.         'shop_id' => 15,
    45.         'shop_adress' => 'вул. Київська 546',
    46.         'city' => 'Київ',
    47.         'day' => 'Вс.',
    48.         'startTime' => '00:00:00',
    49.         'endTime' => '08:00:00',
    50.     ],
    51. ];
    52. $result = [];
    53.  
    54. foreach( $test as $val )
    55. {
    56.     $shop_id = $val['shop_id'];
    57.     $shop_adress = $val['shop_adress'];
    58.     $city = $val['city'];
    59.     $day = $val['day'];
    60.     $startTime = $val['startTime'];
    61.     $endTime = $val['endTime'];
    62.  
    63.     if( !isset( $result[$shop_id] ) )
    64.     {
    65.         $result[$shop_id] = [
    66.             'shop_id' => $shop_id,
    67.             'shop_adress' => $shop_adress,
    68.             'city' => $city
    69.         ];
    70.     }
    71.  
    72.     $result[ $shop_id ]['graph'][] = [
    73.         'day' => $day,
    74.         'startTime' => $startTime,
    75.         'endTime' => $endTime,
    76.     ];  
    77. }
    78.  
    79. print_r( $result );
     
    mainprofilemail нравится это.
  11. mainprofilemail

    mainprofilemail Активный пользователь

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Ни в коем случае не ждал пока сделают вместо меня. Просто думал что есть вариант получения данных в таком формате без обработки. Но за решение спасибо)