0 Пользователей и 1 Гость просматривают эту тему.
  • 6 Ответов
  • 629 Просмотров
*

Outpost

  • Новичок
  • 6
  • 0 / 0
Доброго времени суток. Вот столкнулся с проблемой при создании компонента...

Имеется несколько одинаковых таблиц с данными с одинаковой структурой, кол-во и название таблиц неизвестно и может изменяться.
Указывается в конфиге компонента. Например через пробел.

Так же есть одна таблица с названием для данных. Она постоянна и название не меняется.

Ну и требуется вывести данные из всех этих таблиц при этом взяв названия из другой. Например сначало выводятся данные из таблицы1, следом таблица2 и т.д.

Структура у таблиц имеет вид:
   таблица с данными:
   id item(предмет) player(имя пользователя) amount(количество)
   таблица с названиями:
   id item(предмет) name(название предмета)

Вот только не понимаю как это сделать.
Пытался запихнуть в цикл foreach, но чет не получается, либо может не то что-то сделал. В итоге чтобы не делал выводятся данные только из одной таблицы либо первой, либо последней.


Код для выборки для одной таблицы, а что сделать, чтобы выбиралось из всех не могу понять.


Код
$user = & JFactory::getUser()->username;
$table_items  = JComponentHelper::getParams('my_component')->get('tb_items'); //$table_items получается "название_таблицы1 название_таблицы2 название_таблицы3 название_таблицы_и_тд"
$list_table = explode(" ", $table_items); //разбиваем список таблиц на отдельные части
$size = count($list_table);  // подсчитываем кол-во таблиц




$db = JFactory::getDbo();
$query = $db->getQuery(true) ;
$query
->select(array('a.*', 'b.name', 'b.item'))
->from($db->quoteName("items1", "a")) // items1 - одна из таблиц с данными
->join('INNER', $db->quoteName("item_names", "b"). ' ON (' . $db->quoteName('a.item'). ' = ' . $db->quoteName('b.item'). ')') // подбираем название из таблицы с названиями
->where($db->quoteName('a.player'). " LIKE '$user'"); //фильтруем по имени пользователя
return $query;



p.s. надеюсь разделом не ошибся
« Последнее редактирование: 11.02.2019, 12:13:34 от Outpost »
*

Outpost

  • Новичок
  • 6
  • 0 / 0
Пытался вывести цикл. Но в таком варианте показывает только из последней таблицы.Так подозреваю что $query учитывает только последний запрос, если же поместить return $query; внутрь цикла то тогда выполняется только для первой таблицы, а остальные видимо вообще теряются.
Код
for($i = 0, $size = count($list_table); $i < $size; ++$i) {
    $table_all= $list_table[$i];
    echo $table_all;

    $query = $db->getQuery(true) ;
    $query
        ->select(array('a.*', 'b.name', 'b.item'))
        ->from($db->quoteName("$table_all", "a"))
        ->join('INNER', $db->quoteName("$shop", "b"). ' ON (' . $db->quoteName('a.item'). ' = ' . $db->quoteName('b.item'). ')')
        ->where($db->quoteName('a.player'). " LIKE '$user'");
    $db->setQuery($query);   
}
« Последнее редактирование: 11.02.2019, 12:14:07 от Outpost »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Если структура таблиц одинакова, то можно использовать UNION. Кстати, инкремент у вас префиксный, пропускаете первый элемент. Раз взялись за компонент, то неплохо бы изучать принципы работы системы.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Outpost

  • Новичок
  • 6
  • 0 / 0
Если структура таблиц одинакова, то можно использовать UNION. Кстати, инкремент у вас префиксный, пропускаете первый элемент. Раз взялись за компонент, то неплохо бы изучать принципы работы системы.
Спасибо  ^-^  :D . Получилось вывести все таблицы. Не совсем еще правда понимаю. $query->union без основного запроса не будет работать? сам по себе. у меня пока получилась такая штука. и если удаляю основной запрос, то ничего не работает.
но если оставляю основной запрос, то тогда дублируются данные из какой-то одной таблицы)
ничего лучше не придумал как оставить основной запрос к пустой таблице, чтобы убрать дубль  ;D
и смущает getQuery для каждого из запросов. если его удалить то тоже не работает. это я где-то не прав, или так и должно быть?
Код
foreach($list_table as $i => $row):
if ($row) {
$query_all[$i] = $db->getQuery(true) ;
$query_all[$i]
->select(array('a.*', 'b.name', 'b.item'))
->from($db->quoteName("$row", "a"))
->join('INNER', $db->quoteName("item_names", "b"). ' ON (' . $db->quoteName('a.item'). ' = ' . $db->quoteName('b.item'). ')')
->where($db->quoteName('a.player'). " LIKE '$user'");
}
endforeach;

$query = $db->getQuery(true) ;
$query
->select(array('a.*', 'b.name', 'b.item'))
->from($db->quoteName("empty_table", "a"))
->join('INNER', $db->quoteName("item_names", "b"). ' ON (' . $db->quoteName('a.item'). ' = ' . $db->quoteName('b.item'). ')')
->where($db->quoteName('a.player'). " LIKE '$user'");

$query->unionAll($query_all);

$db->setQuery($query);
« Последнее редактирование: 11.02.2019, 12:34:32 от Outpost »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Без основного запроса - никак. Только, кажется, вы сделали лишний запрос. И UNION ALL выдает дубликаты.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Можно попробовать что-то подобное
Код
$query = $db->getQuery(true);

foreach ($list_table as $i => $row)
{
$statement =
'SELECT a.*, b.name, b.item ' .
'FROM ' . $db->quoteName($row). ' AS a ' .
'INNER JOIN ' . $db->quoteName('item_names'). ' AS b ' .
' ON (' . $db->quoteName('a.item'). ' = ' . $db->quoteName('b.item'). ')';

if ($i == 0)
{
$query->setQuery($statement);
}
else
{
$query->unionAll($statement);
}
}

$db->setQuery($query);
Только набросал, не тестировал.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Понял так, что для каждой записи в "таблица с названием для данных" создается "таблица с данными"
Если правильно, то много таблиц с данными не нужно, одна таблица и связь один ко многим.
Много таблиц с одинаковой структурой, всегда подозрительно, что неправильно спроектирована БД. Отсюда и все ваши затруднения.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Прописать условие для сохранения данных в БД

Автор semen1707

Ответов: 0
Просмотров: 314
Последний ответ 14.04.2021, 00:59:44
от semen1707
Модель для представления, которое показывает списки данных разных типов

Автор borro

Ответов: 27
Просмотров: 899
Последний ответ 06.05.2020, 11:57:12
от Septdir
Не занимать место под пустой вывод модуля

Автор platonische

Ответов: 11
Просмотров: 665
Последний ответ 28.04.2020, 07:53:11
от sivers
Связать две таблицы с БД для дальнейшего вывода данных с них

Автор golinejj

Ответов: 16
Просмотров: 761
Последний ответ 06.02.2020, 15:40:58
от golinejj
Редактирование данных в связанных таблицах

Автор NetFix

Ответов: 1
Просмотров: 590
Последний ответ 19.03.2019, 11:07:10
от platonische