2016-01-06 3 views
1

Так следующие работыMysql dyanmic значение в качестве псевдонима

$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"; 

Однако есть много значений, которые должны быть присоединены к объекту в таблице А, и сейчас все они создают свой собственный вложенный массив на основе нового стоимость.

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 
... 

Im думая, что это происходит из-за того же имя ключа пытается соединить, и поэтому я хотел бы использовать что-то более динамичное, такие как другое значение, например, как значение 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, 
    ... 

Возможно ли это? Или я об этом неправильно?

ответ

0

Почему вы используете левое соединение вместо внутреннего соединения? Кроме того, если вы выполняете динамические запросы. Вам следует рассмотреть возможность использования хранимых процедур. Вы можете установить инструкцию 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 
 
\t set @htwsql := concat(@htwsql, ' from table1 t1'); 
 
else 
 
\t 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 
 
\t 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

p.s .: Будьте осторожны с именами, которые вы используете в качестве псевдонима. Они могут быть зарезервированы синтаксисом SQL.

Смежные вопросы