Разбивка на две таблицы SQL с одним запросом. Самый быстрый путь

У меня есть простая база данных:

Table 1: Object                    Table 2: Data
id | type | added                  object_id | key     | value
------------------------           -----------------------------
1  | app  | 2017                   1         | name     | ...
2  | app  | 2017                   2         | name     | ...
3  | win  | 2017                   2         | version  | ...
2         | dev_name | ...
2         | lang     | ...

я создал простую нумерацию страниц, чтобы показать только 5 объектов из приложений типа с их информацией из таблицы данных:

example code:
$sth = $dbh->prepare("SELECT * FROM object WHERE type = 'app' LIMIT 5");
$sth->execute;
$object = $sth->fetchAll(PDO::FETCH_ASSOC);

foreach($object as $rows) {
$sth = $dbh->prepare("SELECT * FROM data WHERE id = $rows['id']");
$sth->execute;
$data = $sth->fetchAll(PDO::FETCH_ASSOC);

echo $data['name'];
echo $data['version'];
echo $object['added'];
...

Есть ли способ лучше? потому что это очень плохое решение, я хочу запросить только один раз, когда я получаю массив выборки, как это:

array(
// app with id = 1 in object table
[1] => array(
// data from the app with id = 1 in data table
[name] => ...
[version] => ...
[dev_name] => ...
[lang] => ...
// app with id = 2 in object table
[2] => array(
// data from the app with id = 2 in data table
[name] => ...
[version] => ...
[dev_name] => ...
[lang] => ...
...

-1

Решение

один запрос:

SELECT * FROM object inner join data on data.id_object=object.id WHERE object.type = 'app' LIMIT 5

Этот запрос возвращает информацию из двух таблиц с ассоциированными данными.
Я думаю, это то, что вы хотите

Если вы хотите сгруппировать по идентификатору первой таблицы, вы также можете выполнить этот запрос

SELECT * FROM object inner join data on data.id_object=object.id WHERE object.type = 'app' group by object.id LIMIT 5

или же

SELECT Distinct(object.id), object.type, .... FROM object inner join data on data.id_object=object.id WHERE object.type = 'app'  LIMIT 5

Для сравнения строк используйте LIKE вместо =

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector