0

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

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”?谢谢。

4

1 回答 1

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}";
}
于 2013-05-18T19:12:10.033 回答