Вопрос следующий есть база все хранится в разных таблицах(скрин) " при запросе PHP: $sql=" SELECT car_type.name, car_mark.name, car_model.name, car_serie.name,car_modification.name, car_characteristic_value.value,car_characteristic.name from car_mark join car_model on car_model.id_car_mark = car_mark.id_car_mark join car_type join car_serie on car_serie.id_car_model =car_model.id_car_model join car_modification on car_modification.id_car_model =car_model.id_car_model and car_modification.id_car_serie = car_serie.id_car_serie join car_characteristic_value on car_characteristic_value.id_car_modification = car_modification.id_car_modification join car_characteristic on car_characteristic.id_car_characteristic = car_characteristic_value.id_car_characteristic limit 1500 "; получается так PHP: Array ( [0] => мотоциклы [1] => BSE [2] => PH06B [3] => PH06B-50 10/10 [4] => 88cc (2.7Hp) [5] => Питбайк [6] => Тип ) Array ( [0] => багги [1] => BSE [2] => PH06B [3] => PH06B-50 10/10 [4] => 88cc (2.7Hp) [5] => Питбайк [6] => Тип ) Array ( [0] => мотовездеходы [1] => BSE [2] => PH06B [3] => PH06B-50 10/10 [4] => 88cc (2.7Hp) [5] => Питбайк [6] => Тип ) Array ( [0] => скутеры [1] => BSE [2] => PH06B [3] => PH06B-50 10/10 [4] => 88cc (2.7Hp) [5] => Питбайк [6] => Тип ) как сделать так что бы к определенному товару например PHP: [0] => скутеры [1] => BSE [2] => PH06B [3] => PH06B-50 10/10 [4] => 88cc (2.7Hp) [5] => Питбайк дописывались дальше его характеристики которые лежат в базе, сейчас он создает для каждой характеристики отдельный массив
ну если ты определишь что в твоёй базе "товар", то будет понятно какой id использовать для связи. твои скриншоты как-то не добавляют ясности. лучше бы структуру как create table показал — хотябы первые пять полей каждой из таблиц. --- Добавлено --- похоже здесь Entity-Attribute-Value car_characteristic это "поля", то есть Attribute car_characteristic_value "значение полей", то есть Value. осталось понять где здесь "cущности", т.e. Entity.
"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
Так все отлично работает теперь правда выдает ошибку что мало памяти но memory_limit стоит 8000M как быть? вылетает когда убираешь лимит в sql запросе
Как быть? Не хотеть слишком многого враз, наверное. Используй такую логику приложения, которая бы не требовала присутствия сразу всех данных в оперативке.
а данных в базе много, как разделить запрос? вернее как сделать что бы по очередно что ли выполнял не заполняя оперативку
что выполнять-то? у меня телепатическая машина сломалась краткий перечень чего делать не надо: - SELECT * когда нужны 1, 2 поля - запрашивать строки только чтобы посчитать их через num_rows() - отказываться от LIMIT что делать рекомендуется когда реально надо обработать кучу данных - обрабатывать строки по одной не накапливая их ни в каком массиве или объекте
- обрабатывать строки по одной не накапливая их ни в каком массиве или объекте вот как перебрать данные не запихивая в массив вот листинг PHP: <? ini_set('memory_limit','8000M'); mysql_connect("localhost", "admin", "admin") or die("Ошибка соединения: " . mysql_error()); mysql_select_db("sandbox"); mysql_set_charset('utf8'); $sql=" SELECT car_type.name as type, car_mark.name as name_type, car_model.name as name_model, car_serie.name as serie,car_modification.name as modification, car_characteristic.name as car_characteristic,car_characteristic_value.value as char_v,car_characteristic_value.unit as unit from car_mark join car_model on car_model.id_car_mark = car_mark.id_car_mark join car_type join car_serie on car_serie.id_car_model =car_model.id_car_model join car_modification on car_modification.id_car_model =car_model.id_car_model and car_modification.id_car_serie = car_serie.id_car_serie join car_characteristic_value on car_characteristic_value.id_car_modification = car_modification.id_car_modification join car_characteristic on car_characteristic.id_car_characteristic = car_characteristic_value.id_car_characteristic "; $result=mysql_query($sql ) or die("ОШИБКА при выполнении запроса".$sql); $result_list = array(); while($row = mysql_fetch_array($result,MYSQL_ASSOC)) { $result_list[] = $row; } $fp = fopen('file.csv', 'w'); foreach($result_list as $row) { $row= array( 'type' => $row['0'], 'name_type' => $row['name_type'], 'name_model' => $row['name_model'], 'serie' => $row['serie'], 'modification' => $row['modification'], ); foreach ($result_list as $entry) { $row[$entry["car_characteristic"]] = $entry["char_v"] .$entry["unit"]; } //print_r($row); } fputcsv($fp, $row); $assoc =array(); fclose($fp); ?>
где вопрос? --- Добавлено --- ввиду отсутствия присутсвия желания разбираться переношу вопрос в сделайте за меня и удачи в этом безнадёжном деле
ну сейчас ты их перебираешь данные и запихиваешь в массив, затем перебираешь массив. переделай на один цикл: перебирай и сразу делай что надо (не запихивая). надо убрать две строки. постарайся не накосячить при этом. LOL — Капитан Очевидность P.S. этот раздел точно для тебя. 100% попадание.