2015-12-30 4 views
0

У меня есть таблица вроде этого:Как создать динамический запрос с помощью php?

// mytable 
+----+---------+------------+ 
| id | id_post | code_table | 
+----+---------+------------+ 
| 1 | 34523 | 1   | 
| 2 | 3453 | 4   | 
| 3 | 43434 | 2   | 
| 4 | 54321 | 1   | 
| 5 | NULL | NULL  | 
| 6 | 32411 | 2   | 
| 7 | 42313 | 1   | 
| 8 | 34242 | 2   | 
+----+---------+------------+ 
//     ^all of my focus is on this column 

Также у меня есть этот массив:

$convert_code_name = array (
         "1" => "Post1", 
         "2" => "Post2", 
         "3" => "Post3", 
         "4" => "Post4" 
          ); 

Теперь я хочу создать этот:

$query = "select * from post1 
      union all 
      select * from post2 
      union all 
      select * from post4"; 

      // there isn't "post3", because 3 isn't exist in the code_table column 

Как я могу это сделать ?


Вот моей попробовать:

// connect to database 
$stm = $db->prepare('select * from mytable'); 
$stm->execute(); 
$result = $stm->fetch(); 

/* array_unique: removes duplicate values 
    array_filter: removes "NULL" values */ 

array_filter(array_unique($result[code_table]), function($item) { 
    return $item != 'NULL'; 
}); 

foreach($item as $numb){ 
    $query .= 'select * from'.$convert_code_name[$numb].'union all'; 
} 

Но я не знаю, почему мой код не работает, как я могу это сделать?

+1

Я думаю, вам просто нужен список 'in'. –

+0

'array_filter' возвращает новый массив, вам нужно назначить его переменной. – Barmar

+0

'$ result' просто содержит первую строку таблицы. Вы имели в виду использовать 'fetchAll'? – Barmar

ответ

3

Сначала воспользуйтесь SELECT DISTINCT в запросе, чтобы получить уникальные значения, поэтому вам не нужно звонить array_unique.

Затем, как только у вас есть все значения, вы можете использовать implode для подключения всех SELECT запросов с UNION ALL.

$stm = $db->prepare("SELECT DISTINCT code_table FROM mytable WHERE code_table IS NOT NULL"); 
$stm->execute(); 
$results = $stm->fetchAll(); 
// This returns a 2-dimensional array, we just want one column 
$results = array_column($results, 'code_table'); 

$query = implode(' UNION ALL ', array_map(function($code_table) use ($convert_code_name) { 
    return "SELECT * FROM " . $convert_code_name[$code_table]; 
}, $results)); 
+0

О, Господи! Я не знаю, что сказать. Отлично. +1 – stack

+0

Ну, я смущен, чтобы пинговать вас снова, но ..., Посмотрите, что ваш код кажется абсолютно правильным. Но я не знаю, почему это не выполняется ..! Моя версия php устарела (5.2.6). Я думаю, что 'array_map (функция ($ code_table)' имеет проблему с моей версией php. Есть ли альтернатива? – stack

+1

Вы должны использовать 'create_function' в этой старой версии. Упражнение для читателя, у меня нет времени показать это. – Barmar

1
$query .= 'select * from'.$convert_code_name[$numb].'union all'; 

будет генерировать неправильный SQL, изменить его (я предполагаю, что $ convert_code_name [$ онемели] содержит полное имя таблицы, как Post1, Post2):

$query = ''; 
foreach($item as $numb){ 
    $query .= ($query!=''?' union all ':'') . 'select * from '.$convert_code_name[$numb]; 
} 
+0

Не могли бы вы рассказать мне, как я могу ** не выбрать ** значения NULL в запросе? – stack

+0

@stack 'где поле не пустое –

+0

Спасибо .....! +1 – stack

0

Вам просто нужно сначала выполнить этот запрос :

SELECT DISTINCT code_table FROM events 

Тогда вы можете создать свой второй запрос, как от его результата, который содержит только 1 строку для каждого существующего code_table.

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