繁体   English   中英

将两个查询合并为一个查询

[英]Merge two queries into single query

我有一个从数据库获取信息的功能,即歌曲表中的歌曲数量和歌手表中具有歌曲表中歌手的歌手数量:

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

这实际上很容易。 您要使用艺术家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}";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM