PHP / MYSQL:如何在while循环中循环来自查询的匹配结果
Posted
技术标签:
【中文标题】PHP / MYSQL:如何在while循环中循环来自查询的匹配结果【英文标题】:PHP/MYSQL: how to loop matching results from a query already inside a while loop 【发布时间】:2015-02-14 08:43:48 【问题描述】:我对 php/mysql 很陌生,发现这很难解释,所以希望有人能理解我想要做什么。我有一个收集艺术家和歌曲信息的数据库。我希望能够将艺术家链接到歌曲并显示带有歌曲信息的“信用”。
我有一个数据库,其中包含类似这样的表:
艺术家 |艺术家 ID,艺术家姓名
学分 | credit_id, credit_name
歌曲 | song_id, song_name
Credit_To_Artist | credit_id、artist_id、song_id
示例数据:
艺术家 | 2、彼得马克
艺术家 | 5、梅特·克里斯蒂安森
学分 | 1、制片人
学分 | 2、作家
学分 | 3、主唱
歌曲 | 23、游戏
Credit_To_Artist | 1、2、23
Credit_To_Artist | 2、2、23
Credit_To_Artist | 3、5、23
我创建了一个页面“song.php”,显示每首歌曲的信息,使用 mysql_real_escape_string 从 URL 中获取歌曲 ID:
$id = mysql_real_escape_string($_GET['id']);
if (!$id)
die('Please provide an id!');
$query = "SELECT * FROM `Credit_To_Artist` AS c2a
INNER JOIN `Credits` AS cr ON cr.credit_id = c2a.credit_id
LEFT OUTER JOIN `Artist` AS a ON a.artist_id = c2a.artist_id
LEFT OUTER JOIN `Song` AS s ON s.song_id = c2a.song_id
WHERE c2a.song_id = $id";
$res = mysql_query($query);
$row = mysql_fetch_assoc($res);
我遇到的问题是,我希望能够列出与该歌曲相关联的所有艺术家,以及他们在旁边括号中的所有作品。由于每首歌都有不止一位艺术家,而且他们中的大多数人都有不止一个功劳(制作人、作家、歌手等),我不知道如何编写一个循环函数来显示这两者。下面是我试图说明我的意思,尽管它显然不起作用:
while ($row = mysql_fetch_array($res))
$artist = $row[artist_name];
echo "$artist";
while ($row = mysql_fetch_array($res))
$credit = $row[credit_name];
echo "$credit";
echo "<br />";
这是我希望从上面的示例数据中实现的理想目标:
歌曲:游戏
致谢: Peter Mark(制片人、作家) 梅特·克里斯蒂安森(歌手)
【问题讨论】:
我认为您正在搜索GROUP_CONCAT(..)
。或者,循环遍历所有结果并将它们添加到数组中,然后用逗号将它们内爆。
谢谢你的回复,如果不是太麻烦你能给我一个简单的例子吗?作为新手,这些听起来像是很好的解决方案,但我可能需要几个月的时间来学习如何编写它们哈哈
【参考方案1】:
让我们从表格开始,这是我认为你应该做的事情
artist | id, name
song | id, title
credit | id, credit
song_artists | id, song_id, artist_id
credit_to_artists | id, song_artists_id, credit_id
应该是处理你想要的那种关系的方式。
这里是 PHP 代码,它可能不是最有效的,但它会完成这项工作
$query = "SELECT * FROM song_artists WHERE song_id = $id_from_link";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
$artistQuery = "SELECT * from artist WHERE id = $row['artist_id']";
$artistResult = mysql_query($artistQuery);
while($artistRow = mysql_fetch_array($artistResult))
echo "The Artist: " . $artistRow['name'];
echo $songArtistId;
$creditToArtistQuery = "SELECT * FROM credit_to_artists WHERE song_artists_id = $row['id']";
$creditToArtistResult = mysql_query($creditToArtistQuery);
if(mysql_num_rows($creditToArtistResult)>0)
echo " ";
$isFirstCredit = true;
while($creditToArtistRow = mysql_fetch_array($creditToArtistResult))
$creditQuery = "SELECT * FROM credit WHERE id = $creditToArtistRow['credit_id']";
$creditResult = mysql_query($creditQuery);
while($creditRow = mysql_fetch_array($creditResult))
if($isFirstCredit)
echo $creditRow['credit'];
$isFirstCredit = false;
else
echo ", " .$creditRow['credit'];
echo " <br />";
【讨论】:
【参考方案2】:你有两个选择:
GROUP_CONCAT(..)
您可以使用GROUP_CONCAT(..)
。此 mysql 函数将每个组中的列中的值分组。在这种情况下,您可以将 sql 更改为按艺术家 ID 分组。
SELECT a.artist_name as aname, GROUP_CONCAT(c.credit_name) as credits
FROM Credits_To_Artist as c2a
JOIN Artist as a ON c2a.artist_id = a.artist_id
JOIN Credits as c ON c2a.credit_id = c.credit_id
GROUP BY c2a.credit_id
你的行看起来像:
Array( "aname" => "name",
"credits" => "function 1,function 2" )
GROUP_CONCAT 最大的问题是如果你必须将很多值连接在一起,它可能会超过行的最大宽度。您的问题似乎并非如此。这种方法不需要循环。
添加到数组
如果您保持查询原样,则每个“信用”都有一行。您可以通过将数据添加到数组来准备数据,然后在 php 中使用 implode(..)
添加逗号。
$artists = Array();
while( $row = mysql_fetch_array($res) )
$artist = $row[artist_name];
$credit = $row[credit_name];
if( !array_key_exists( $artist, $artists ) )
$artists[$artist] = Array();
$artists[$artist][] = $credit;
foreach( $artists as $artist => $creditarr )
$credits = implode( ", ", $creditarr );
echo "$artist ($credits)<br>";
您会发现,在数组中准备数据有时比编写执行相同操作的查询要快得多。我可能会选择后一种解决方案。
【讨论】:
“添加到数组”解决方案完美运行,非常感谢! 另外,我敢肯定这很简单,但我怎样才能使“$artist”成为在其 URL 中使用艺术家 ID 的链接? (例如 $artist 创建一个数组$artisttoid
。确定每个艺术家只运行一次的代码,并将您的翻译添加到那里的数组中。然后你可以做$artisttoid[$artist]
。
我不太懂数组,但我会试试,谢谢
我不想成为一个唠叨的人,但我一直在努力,但我无法用新数组更改代码,你能帮忙或提供更详细的说明吗?以上是关于PHP / MYSQL:如何在while循环中循环来自查询的匹配结果的主要内容,如果未能解决你的问题,请参考以下文章
在 while 循环中使用 mysqli_fetch_array 时,PHP/MySQL 如何知道获取下一行?
PHP / MySQL:如何使用WHILE循环插入数据库[重复]
在 PHP While 循环中使用 MySQL JOIN 而不是查询
如何在 PHP 中列出与 while 循环相同的 id 数据? [关闭]