Как ограничить foreach для нескольких таблиц как одного - PullRequest
0 голосов
/ 26 августа 2018

У меня проблема с LIMIT с foreach с использованием PHP.

Основы: У меня 50 разных таблиц, и в каждой таблице 2 строки.

Когда я пытаюсь добавить LIMIT 1 к $$modules_for_all, я вижу 50 строк, но я хочу видеть только 1. Если я добавлю LIMIT 2, то я вижу 100 строк.

Как яМожно ли соединить все эти таблицы как одну LIMIT 1, чтобы получить 1 строку в foreach?

<?php
for ($i = 1; $i <= 50; $i++) {

  // $array_table_name contains names with tables
  $table_names = $array_table_name[$i];

  $modules_for_all = 'g_module_for_all_'.$i;
  $$modules_for_all = $db->QueryFetchArrayAll("SELECT * FROM $table_names WHERE user='1' LIMIT 1");

}

for ($i = 1; $i <= 50; $i++) {

  $modules_for_from = ${"g_module_for_all_$i"};

  foreach ($modules_for_from as $m_foreach_as) {

    echo $m_foreach_as['id'];

  }

}

Примеры таблиц:

table_1
id   date_added
1    2018-12-01 00:00:00
2    2018-12-02 00:00:00

table_2
id   date_added
1    2018-12-03 00:00:00
2    2018-12-04 00:00:00

table_3
id   date_added
1    2018-12-05 00:00:00
2    2018-12-06 00:00:00

Пример foreach:

<?php
$array_table_name_1 = 'table_1';
$array_table_name_2 = 'table_2';
$array_table_name_3 = 'table_3';

$for_table_1 = $db->QueryFetchArrayAll("SELECT * FROM $array_table_name_1 WHERE id='1' LIMIT 1 ORDER BY date_added");
$for_table_2 = $db->QueryFetchArrayAll("SELECT * FROM $array_table_name_2 WHERE id='1' LIMIT 1 ORDER BY date_added");
$for_table_3 = $db->QueryFetchArrayAll("SELECT * FROM $array_table_name_3 WHERE id='1' LIMIT 1 ORDER BY date_added");

foreach ($for_table_1 as $m_foreach_as) {
  echo $m_foreach_as['id'];
}

foreach ($for_table_2 as $m_foreach_as) {
  echo $m_foreach_as['id'];
}

foreach ($for_table_3 as $m_foreach_as) {
  echo $m_foreach_as['id'];
}

// Now result is '111' but I want only '1' (realted to make LIMIT 1 to all foreach)

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Вам нужно будет использовать UNION ALL для суммирования этих строк перед упорядочением и ограничением результатов.

Но имейте в виду, что такой запрос будет работать только , если всетаблицы в вашем массиве имеют такую ​​же структуру.Если они этого не делают, то вам нужно быть конкретным в запросе, чтобы они имели те же поля.

$array_table_name = [
    'table_1',
    'table_2',
    'table_3',
];

$search_id = 1;

$selectsArray = [];
foreach ($array_table_name as $table_name) {
    $selectsArray[] = "SELECT * FROM $table_name WHERE id='$search_id'\n";
}

Как видите, я использую foreach(), а не for(), поэтому вы выигралине обновлять, уменьшая / увеличивая количество таблиц в массиве.Итак, чтобы наконец иметь:

$selectsUnion = implode("UNION ALL\n", $selectsArray) . "ORDER BY date_added \nLIMIT 1";

Вы можете увидеть протестированный код и смонтированный запрос здесь: https://3v4l.org/HXH2K

0 голосов
/ 27 августа 2018

Я решил свою проблему, используя это: foreach ($modules_for_from as $m_foreach_as) if ($tmp++ < 1) {

0 голосов
/ 27 августа 2018

Единственный способ соединить таблицы - использовать UNION.Таким образом, вам нужно будет создать один большой запрос UNION, а затем выполнить выбор после цикла:

$tables = array();
for ($i = 1; $i <= 50; $i++) {  
  // $array_table_name contains names with tables
  $table_names = $array_table_name[$i];
  $tables[] = "(SELECT * FROM $table_names WHERE user='1')";    
}
$query = implode(" UNION ", $tables) . " ORDER BY date_added LIMIT 1";
$result = $db->QueryFetchArrayAll($query);
foreach ($result as $row) {
    echo $row;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...