将两个查询合并为一个

3
我希望能将两个查询优化为一个,如果可能的话。
我的第一个查询是搜索所有歌词作者... 然后,对于每个找到的作者,我想找到该作者涉及的歌词总数...
现在,我正在执行第一个查询,对于每个找到的行,我都会启动另一个查询来获取作者参与的歌词总数... 因此,如果有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();
?>

能否优化这个查询?如果可以,如何优化?您能提供一个链接让我学习吗?

谢谢 马可


你应该从查询行中删除 @。在那里隐藏错误意味着你将无法看到任何错误。这可能会导致一些困难,试图弄清楚发生了什么。 - Chris Henry
你的代码容易受到SQL注入攻击。一旦被利用,任何菜鸟黑客都能侵入你的数据库。我强烈建议在开始构建严肃的Web应用程序之前,先阅读一些基本的安全知识。 - AardvarkSoup
不用担心安全问题... 正如所述,这只是一个样例代码,为了可读性,并非真实代码... 我已经在真实代码中处理了 SQL 注入问题... - Marco
2个回答

1

这真是令人困惑。既然你有一个名为lyricsid的属性,为什么要将trackid作为lyricsid传递呢?? 不管怎样

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

我认为...


我刚刚编辑了我的示例代码(示例,不是真正的代码),就在你回答的时候...为此感到抱歉。 - Marco

1
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接