Итак, следующие работы
$query = "SELECT A.entity_id, B.value AS variable_character, C.value AS text, D.value AS integer FROM customer_address_entity AS A LEFT JOIN customer_address_entity_varchar AS B ON B.entity_id = A.entity_id LEFT JOIN customer_address_entity_text AS C ON C.entity_id = A.entity_id LEFT JOIN customer_address_entity_int AS D ON A.entity_id = D.entity_id ORDER BY A.entity_id DESC LIMIT 100";
Однако есть много значений, которые необходимо присоединить к сущности в таблице A, и сейчас они все создают свой собственный вложенный массив на основе нового значения.
0 => array (size=4) 'entity_id' => string '597424' (length=6) 'variable_character' => string 'Dave' (length=4) 'text' => string '45 Haven Rd' (length=11) 'intiger' => string '43' (length=2) 1 => array (size=4) 'entity_id' => string '597424' (length=6) 'variable_character' => null 'text' => string '45 Haven Rd' (length=11) 'intiger' => string '43' (length=2) 2 => array (size=4) 'entity_id' => string '597424' (length=6) 'variable_character' => string 'Danielson' (length=9) 'text' => string '45 Haven Rd' (length=11) 'integer' => string '43' (length=2) 3 => etc ...
Я думаю, что это связано с тем же именем ключа, который пытается соединиться, и поэтому я хотел бы использовать нечто более динамичное, такое как другое значение, такое как значение B.attribute_type_id. где я мог бы получить массив, похожий на
array (size=7) 'entity_id' => string '597424' (length=6) '1' => null '2' => 'Dave' '3' => 'Danielson' '4' => '45 Haven Road' 'text' => string '45 Haven Rd' (length=11) 'intiger' => string '43' (length=2)
Или еще лучше: заголовок для атрибутов живет в другой таблице, называемой eav_attribute, и что действительно было бы идеальным, было бы чем-то вроде
$query = "SELECT A.entity_id, B.value AS (SELECT attribute_code FROM eav_attribute WHERE attribute_id = B.attribute_id), C.value AS text, ...
Что-то вроде этого возможно? Или я об этом неправильно?
Почему вы используете левое соединение вместо внутреннего соединения? Кроме того, если вы выполняете динамические запросы. Вам следует рассмотреть возможность использования хранимых процедур. Вы можете установить инструкцию SQL в переменную, а затем выполнить. Вот краткий пример:
CREATE DEFINER=`YourDBUSER`@`localhost` PROCEDURE `rtYourProcedureName`(IN variable1 int,variable2d varchar(100), sortBy varchar(50), startRow int, ThisSQL varchar(5000), OUT totalRows int) BEGIN ###start: MySQL is dumb and do not allow default parameter values, set here: SET @variable1 = IFNULL(variable1 ,'0'); SET @variable2 = IFNULL(variable2 ,''); SET @sortBy = IFNULL(sortBy ,''); SET @startRow = IFNULL(startRow ,1); ###end: MySQL is dumb and do not allow default parameter values set @htwsql = ThisSQL; set @htwsql = ' SELECT SQL_CALC_FOUND_ROWS STRAIGHT_JOIN t1.field1 ,t2.field2 '; if @variable1 = 0 then set @htwsql := concat(@htwsql, ' from table1 t1'); else set @htwsql := concat(@htwsql,' from table2 t2 w INNER JOIN table1 t1 '); end if; set @htwsql := concat(@htwsql, ' where 1 = 1 '); ### sort order if rtrim(ltrim(@sortBy)) <> '' then set @htwsql := concat(@htwsql,char(13), ' ORDER BY ' , cast(@sortBy as char(50))); end if; ### limit records for pagination set @htwsql := concat(@htwsql,char(13), ' LIMIT ', StartRow-1 ,',',24); ### just to debug the generated SQL insert into rtlogtmp (log) select concat ('rtYourProcedureName SQL = ',@htwsql); PREPARE stmt1 FROM @htwsql; EXECUTE stmt1; DEALLOCATE PREPARE stmt1; SELECT FOUND_ROWS() into totalRows; END