【问题标题】:Merge two queries into single query将两个查询合并为一个查询
【发布时间】:2013-05-18 18:07:06
【问题描述】:

我有这个从数据库中获取信息的功能,即歌曲表中的歌曲数量和艺术家表中歌曲表中有歌曲的艺术家数量:

function getInfo() {
    try {
        $q = $this->connection->prepare('SELECT artist_id FROM '.TBL_SONG.'');
        $q->execute();
        if ($q->rowCount() > 0) {
            $songs = $q->rowCount();
        } else {
            $songs = '0';
        }
        $q = $this->connection->prepare('SELECT id FROM '.TBL_ARTIST.' a WHERE EXISTS (SELECT * FROM '.TBL_SONG.' s WHERE a.id = s.artist_id)');
        $q->execute();
        if ($q->rowCount() > 0) {
            $artists = $q->rowCount();
        } else {
            $artists = '0';
        }
        return "<span class='italic'>Current songs: </span>".$songs." <span class='italic'>Active artists: </span>".$artists;
    } catch (PDOException $e) {
        echo RESULTS_ERROR;
        logError($e->getMessage());
    }
}

第一个查询从歌曲表中获取歌曲数量,并将行数返回给一个变量。如果歌曲表中有歌曲,则第二个查询从艺术家表中获取艺术家 ID。此函数的结果是返回两个值。

我希望能够从单个查询中返回这两个值。我尝试将其编写为一个查询并获取结果并使用 count 函数来获取我需要的行数,但这似乎不起作用。真的不知道我要去哪里错了。此外,使用 if 语句检查行数是否 > 0 并将其存储在变量中是否毫无意义,因为它无论如何都会返回值“0”?谢谢。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这其实很简单。您想使用艺术家 ID 加入艺术家表和歌曲表。从该连接中,您想知道不同艺术家 ID 和歌曲 ID 的数量。您想要的查询将是这样的:

    select count(distinct a.id) as artists, count(distinct s.id) as songs
    from artists a
    inner join songs s on s.artist_id = a.id;
    

    我强烈建议您在将查询插入 PHP 之前直接从某种控制台获取查询。输出将是单行,如下所示:

    +---------+-------+
    | artists | songs |
    +---------+-------+
    |      20 |   150 |
    +---------+-------+
    

    从 PHP 中,您只需要获取单行答案并在您的响应中使用它:

    if ($q->rowCount() > 0) {
        $c = $q->fetchObject();
        $output = "<span class='italic'>Current songs: </span>{$c->songs}<span class='italic'>Active artists: </span>{$c->artists}";
    }
    

    【讨论】:

    • 根据您的数据库组织,您甚至可能不需要加入表。您也许可以只从歌曲表中计算 id 和 Artist_id。
    • 啊,这行得通!我玩弄它时得到了一些令人困惑的结果。我可以获得正确的艺术家人数,但如果我将查询的第二部分更改为表列而不是 * 它将改变艺术家人数。此外,从 $->fetch() 更改为 $q->fetchAll(PDO::FETCH_ASSOC) 也会导致它停止工作。最后,当在第一部分使用 COUNT(id) 作为artist_count 并在第二部分使用 COUNT(id) 作为 song_count 时,它将对艺术家起作用,但对于歌曲计数,它会说未定义的变量,即使知道它们都来自相同的数组:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多