За последние 24 часа нас посетили 19946 программистов и 1638 роботов. Сейчас ищут 1930 программистов ...

Как вывести характеристики из бд?

Тема в разделе "Сделайте за меня", создана пользователем Valackar, 28 ноя 2016.

Метки:
  1. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    Вопрос следующий есть база все хранится в разных таблицах(скрин)
    [​IMG] "
    [​IMG]
    [​IMG]
    при запросе
    PHP:
    1. $sql="
    2. SELECT car_type.name, car_mark.name, car_model.name,
    3. car_serie.name,car_modification.name,
    4. car_characteristic_value.value,car_characteristic.name
    5. from car_mark
    6. join car_model
    7. on car_model.id_car_mark = car_mark.id_car_mark
    8. join car_type
    9. join car_serie
    10. on car_serie.id_car_model =car_model.id_car_model
    11. join car_modification
    12. on car_modification.id_car_model =car_model.id_car_model and car_modification.id_car_serie = car_serie.id_car_serie
    13.  
    14. join car_characteristic_value
    15. on car_characteristic_value.id_car_modification = car_modification.id_car_modification
    16. join car_characteristic
    17. on car_characteristic.id_car_characteristic = car_characteristic_value.id_car_characteristic
    18. limit 1500
    19.  
    20. ";
    получается так

    PHP:
    1. (
    2. [0] => мотоциклы
    3. [1] => BSE
    4. [2] => PH06B
    5. [3] => PH06B-50 10/10
    6. [4] => 88cc (2.7Hp)
    7. [5] => Питбайк
    8. [6] => Тип
    9. )
    10. (
    11. [0] => багги
    12. [1] => BSE
    13. [2] => PH06B
    14. [3] => PH06B-50 10/10
    15. [4] => 88cc (2.7Hp)
    16. [5] => Питбайк
    17. [6] => Тип
    18. )
    19. (
    20. [0] => мотовездеходы
    21. [1] => BSE
    22. [2] => PH06B
    23. [3] => PH06B-50 10/10
    24. [4] => 88cc (2.7Hp)
    25. [5] => Питбайк
    26. [6] => Тип
    27. )
    28. (
    29. [0] => скутеры
    30. [1] => BSE
    31. [2] => PH06B
    32. [3] => PH06B-50 10/10
    33. [4] => 88cc (2.7Hp)
    34. [5] => Питбайк
    35. [6] => Тип
    36. )
    как сделать так что бы к определенному товару например
    PHP:
    1. [0] => скутеры
    2. [1] => BSE
    3. [2] => PH06B
    4. [3] => PH06B-50 10/10
    5. [4] => 88cc (2.7Hp)
    6. [5] => Питбайк
    дописывались дальше его характеристики которые лежат в базе, сейчас он создает для каждой характеристики отдельный массив
     
    #1 Valackar, 28 ноя 2016
    Последнее редактирование модератором: 28 ноя 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    нужно характеристики по id машины вывести?
     
  3. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    По id модификации машины. это я так понял единственный идентификатор который все связывает
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    ну если ты определишь что в твоёй базе "товар", то будет понятно какой id использовать для связи.

    твои скриншоты как-то не добавляют ясности. лучше бы структуру как create table показал — хотябы первые пять полей каждой из таблиц.
    --- Добавлено ---
    похоже здесь Entity-Attribute-Value
    car_characteristic это "поля", то есть Attribute
    car_characteristic_value "значение полей", то есть Value.
    осталось понять где здесь "cущности", т.e. Entity.
     
    denis01 нравится это.
  5. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    надеюсь это добавит ясности
     

    Вложения:

    • GJmSlv9Rsy0.jpg
      GJmSlv9Rsy0.jpg
      Размер файла:
      62,5 КБ
      Просмотров:
      6
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    "EAV is evil, except when it isn't." )))

    сущность в car_modifications. атрибуты относятся к записям этой таблицы.

    добыть все значения "в строку" при такой структуре можно только если зафиксировать список возможных значений и это потребует по одному джойну на каждый атрибут. sql не приспособлен для выборок "в ширину" )))

    если попроще, то можно выбрать всё необходимое с двумя джойнами и в три колонки (ну или в шесть, если тебе нужны как id+наименования). а манипуляции со структурой производи уже на стороне PHP.

    http://stackoverflow.com/questions/14740758/how-make-this-eav-query-to-make-horizontal-result
    http://stackoverflow.com/questions/...-value-array-into-associative-array-using-php
    http://stackoverflow.com/questions/11779252/entity-attribute-value-table-design
    http://mysql.rjweb.org/doc.php/eav
     
    #6 artoodetoo, 29 ноя 2016
    Последнее редактирование: 29 ноя 2016
  7. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    спс о результатах отпишусь
     
  8. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    Так все отлично работает теперь правда выдает ошибку что мало памяти но memory_limit стоит 8000M как быть?

    вылетает когда убираешь лимит в sql запросе
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    Как быть? Не хотеть слишком многого враз, наверное. Используй такую логику приложения, которая бы не требовала присутствия сразу всех данных в оперативке.
     
  10. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    а данных в базе много, как разделить запрос?
    вернее как сделать что бы по очередно что ли выполнял не заполняя оперативку
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    что выполнять-то? у меня телепатическая машина сломалась

    краткий перечень чего делать не надо:
    - SELECT * когда нужны 1, 2 поля
    - запрашивать строки только чтобы посчитать их через num_rows()
    - отказываться от LIMIT

    что делать рекомендуется когда реально надо обработать кучу данных
    - обрабатывать строки по одной не накапливая их ни в каком массиве или объекте
     
  12. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    - обрабатывать строки по одной не накапливая их ни в каком массиве или объекте вот как перебрать данные не запихивая в массив вот листинг
    PHP:
    1. <?
    2.  
    3. ini_set('memory_limit','8000M');
    4. mysql_connect("localhost", "admin", "admin") or
    5.     die("Ошибка соединения: " . mysql_error());
    6. mysql_select_db("sandbox");
    7. $sql="
    8. SELECT car_type.name as type, car_mark.name as name_type, car_model.name as name_model,
    9. car_serie.name as serie,car_modification.name as modification,
    10. car_characteristic.name as car_characteristic,car_characteristic_value.value as char_v,car_characteristic_value.unit as unit
    11. from car_mark
    12. join car_model
    13. on car_model.id_car_mark = car_mark.id_car_mark
    14. join car_type
    15. join car_serie
    16. on car_serie.id_car_model =car_model.id_car_model
    17. join car_modification
    18. on car_modification.id_car_model =car_model.id_car_model and car_modification.id_car_serie = car_serie.id_car_serie
    19.  
    20. join car_characteristic_value
    21. on car_characteristic_value.id_car_modification = car_modification.id_car_modification
    22. join car_characteristic
    23. on car_characteristic.id_car_characteristic = car_characteristic_value.id_car_characteristic
    24.  
    25.  
    26.  
    27. ";
    28. $result=mysql_query($sql ) or die("ОШИБКА при выполнении запроса".$sql);
    29. $result_list = array();
    30. while($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
    31.   $result_list[] = $row;
    32. }
    33. $fp = fopen('file.csv', 'w');
    34. foreach($result_list as $row) {
    35.   $row= array(
    36.       'type' => $row['0'],
    37.       'name_type' => $row['name_type'],
    38.       'name_model' => $row['name_model'],
    39.       'serie' => $row['serie'],
    40.       'modification' => $row['modification'],
    41.  
    42. );
    43.   foreach ($result_list as $entry)
    44. {
    45.  
    46.     $row[$entry["car_characteristic"]] = $entry["char_v"] .$entry["unit"];
    47.  
    48. }
    49.  
    50. //print_r($row);
    51. }
    52.  
    53. fputcsv($fp, $row);
    54. $assoc =array();
    55. fclose($fp);
    56. ?>
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    где вопрос?
    --- Добавлено ---
    ввиду отсутствия присутсвия желания разбираться переношу вопрос в сделайте за меня и удачи в этом безнадёжном деле
     
  14. Valackar

    Valackar Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    как перебрать данные не запихивая в массив вот листинг
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    ну сейчас ты их перебираешь данные и запихиваешь в массив, затем перебираешь массив.
    переделай на один цикл: перебирай и сразу делай что надо (не запихивая).
    надо убрать две строки. постарайся не накосячить при этом. LOL
    — Капитан Очевидность

    P.S. этот раздел точно для тебя. 100% попадание.