使用一个查询从两个SQL表中分页。最快的方式

时间:2017-11-01 12:52:08

标签: php jquery mysql 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 个答案:

答案 0 :(得分:0)

一个查询:

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

此查询从两个表中返回包含关联数据的信息。 我认为这就是你想要的东西

如果您想按第一个表的ID进行分组,您也可以执行此查询

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而不是=