Php 将2个查询合并为1个查询

Php 将2个查询合并为1个查询,php,mysql,Php,Mysql,如果可能的话,我希望将两个查询优化为一个查询 我的第一个查询搜索歌词的所有作者。。。然后,对于找到的每个作者,我想找到作者参与的歌词总数 现在,我正在执行第一个查询,对于找到的每一行,我将启动另一个查询,以获取作者参与的歌词总数。。。因此,如果有4位作者,我将再发起4个查询。。。 在我看来,这是许多疑问的答案。这就是为什么我决定写在这里,这样我就可以得到关于如何优化我的查询的帮助 这是我为让作者负责歌词而执行的查询: $sql = "SELECT author.author_id, author

如果可能的话,我希望将两个查询优化为一个查询

我的第一个查询搜索歌词的所有作者。。。然后,对于找到的每个作者,我想找到作者参与的歌词总数

现在,我正在执行第一个查询,对于找到的每一行,我将启动另一个查询,以获取作者参与的歌词总数。。。因此,如果有4位作者,我将再发起4个查询。。。 在我看来,这是许多疑问的答案。这就是为什么我决定写在这里,这样我就可以得到关于如何优化我的查询的帮助

这是我为让作者负责歌词而执行的查询:

$sql = "SELECT author.author_id, author.name
    FROM track INNER JOIN lyrics_author ON track.lyrics_id = lyrics_author.lyrics_id
    INNER JOIN author ON lyrics_author.author_id = author.author_id
    WHERE track.track_id = $trackid ";
这是一个查询,用于获取作者创作的歌词总数:

$total = "SELECT lyrics_author.author_id, count(*) as total
    FROM lyrics_author
    WHERE lyrics_author.author_id = $author_id
    GROUP BY lyrics_author.author_id";
这是代码的一个示例:

<?php
$trackid = 5;

$sql = "SELECT author.author_id, author.name
    FROM track INNER JOIN lyrics_author ON track.lyrics_id = lyrics_author.lyrics_id
    INNER JOIN author ON lyrics_author.author_id = author.author_id
    WHERE track.track_id = $trackid ";

$result_author = @ $conn->query($sql);

while ($row_author = $result_author->fetch_assoc()) {
    $author_id = $row_author['author_id'];

    $total = "SELECT lyrics_author.author_id, count(*) as total
        FROM lyrics_author
        WHERE lyrics_author.author_id = $author_id
        GROUP BY lyrics_author.author_id";

    $result_total_lyrics = @ $conn->query($total);
    $t = $result_total_lyrics->fetch_assoc();

    echo $t['total'];

    $result_total_lyrics->free();
}

$result_author->free();
?>

是否可以优化此查询?如果是,如何进行?有一个链接你可以参考,所以我可以学习

谢谢
马可

这真让人困惑。当您有一个名为lyricsid的属性时,为什么要将trackid作为lyricsid传递?? 反正


我认为…

您应该从查询行中删除
@
。在那里隐藏错误意味着您将无法看到任何错误。这可能会导致在试图弄清楚发生了什么时遇到一些困难。您的代码很容易受到SQL注入的影响。当使用时,任何脚本都可以侵入您的数据库。我强烈建议您在开始构建严肃的web应用程序之前先阅读一些基本的安全知识。不要担心安全性。。。如前所述,这是一个示例代码,出于可读性目的,不是真正的代码。。。我已经在真实代码中处理了sql注入…我在您编写答案时编辑了我的示例代码(示例,而不是真实代码)。。。对不起
SELECT
  author.author_id,
  author.name,
  COUNT(DISTINCT more_tracks.lyrics_id) AS total
FROM track
INNER JOIN lyrics_author USING (lyrics_id)
INNER JOIN author USING (author_id)
LEFT JOIN lyrics_author AS more_tracks USING (author_id)
WHERE track.track_id = $trackid
GROUP BY author.author_id
Select author.author_id, author.name, Count(*)
inner join
(SELECT lyrics_author.author_id 
FROM lyrics_author 
INNER JOIN tracks ON track.lyrics_id = lyrics_author.lyrics_id 
WHERE track.track_id = $lyricsid"; 
)  as lyricalauthors
inner join lyrics_author on lyrics_author.author_id = lyricalauthors.author_id
On author.author_id = lyricalauthors.author_id
Group By Author.author_id,author.name