php 如何使用MYSQL GROUP_CONCAT获取两个变量?

33qvvth1  于 2023-01-04  发布在  PHP
关注(0)|答案(3)|浏览(149)

我有一个网页,显示照片($file),下面的每张照片是一个列表的用户谁'喜欢'每张照片。每个用户显示为一个html链接到他们的个人资料。目前,用户显示和链接的用户名:

<a href=\"profile.php?user_name=".$tag.">".$tag."</a>

但是我想知道如何显示用户的名字,同时使用他们的$user_id链接到他们的个人资料。

<a href=\"profile.php?user_name=".$user_id.">".$tag."</a>

我在查询中使用了GROUP_CONCAT来获取所有user_id的($tag),这些($tag)喜欢tbl_collab中的每一张照片,然后在tbl_users上连接这些结果以获取user_name,但是我不知道如何在html链接中同时显示user_id和user_name。有人能告诉我如何做到这一点吗?

//Database Query
$sql="SELECT up.file,p.user_name,p.user_id, GROUP_CONCAT(cp.user_name)
FROM tbl_uploads up
LEFT JOIN tbl_users p ON up.user_id = p.user_id
LEFT JOIN tbl_collab c ON up.file = c.file
LEFT JOIN tbl_users cp ON cp.user_id = c.collab_userid
GROUP BY up.file";

$result = $mysqli->query($sql);
while($row = $result->fetch_array())
{
    $user_id = explode (",", $row['user_id'] );
    $user = explode (",", $row['user_name'] );
    $files = explode (",", $row['file']);
    $tag_array = explode(',' , $row['GROUP_CONCAT(cp.user_name)']);

    foreach($files as $file) {

    //File is displayed here

    }
    foreach($tag_array as $tag) {

        //Links to the users who liked the file

        <a href=\"profile.php?user_name=".$tag.">".$tag."</a>

    }
}
zi8p0yeb

zi8p0yeb1#

在SQL中获取GROUP_CONCAT中两个值:

GROUP_CONCAT(CONCAT(cp.user_id,'~',cp.user_name) SEPARATOR '|') AS tagGroup

标签数组的foreach中:

$tag_array = explode('|' , $row['tagGroup']);

foreach($tag_array as $tag) {
    list($uid,$uname) = explode('~',$tag,2);

    echo "<a href=\"profile.php?user_id=".$uid.">".$uname."</a>";
}
  • (更新为使用@Jakumi的评论和更多示例,以便于说明--注:我使用了“|'作为GROUP_CONCAT分隔符,因为“\n”的字符转义问题在这里很麻烦)*

祝你好运!

3htmauhk

3htmauhk2#

您不需要为此使用GROUP_CONCAT,只需执行一个普通的JOIN并使用ORDER BY将同一文件的所有行放在一起即可。

<?php
//Database Query
$sql="SELECT up.file,p.user_name,p.user_id, cp.user_name as liker_name, cp.user_idas liker_id
FROM tbl_uploads up
LEFT JOIN tbl_users p ON up.user_id = p.user_id
LEFT JOIN tbl_collab c ON up.file = c.file
LEFT JOIN tbl_users cp ON cp.user_id = c.collab_userid
ORDER BY up.file";

$result = $mysqli->query($sql);
$last_file = null
while($row = $result->fetch_array())
    {
        $user_id = $row['user_id'];
        $user = $row['user_name'];
        $files = $row['file'];
        $liker_id = $row['liker_id'];
        $liker_name = $row['liker_name'];
        if ($file != $last_file) {
            $last_file = $file;
            //File is displayed here
        }
        //Links to the users who liked the file
        echo "<a href=\"profile.php?user_name=".$liker_id.">".$liker_name."</a>
    }
tp5buhyn

tp5buhyn3#

MySQL有一个非常简单的方法来GROUP_CONCAT多个值根据我们的要求。
在你的例子中,你需要做两件事
1.用户标识
1.用户名
那么你只需要试试这个:

GROUP_CONCAT(cp.user_id,' ',cp.user_name) as user

之后,当您在PHP上访问这个user值时,您将收到如下所示的值:

  1. 1个用户名
  2. 2用户名
    然后,根据您的要求,您可以使用explode方法分离这两个值,并使用以下命令获得阵列上的user_iduser_name
$user_array = explode(' ' , $row['user']);

它会提供数组值,但是如果你需要user_iduser_name,你会把它们传递给URL,如下所示:
https:://localhost/user_page/id/user_name
在这种情况下,您只需要像这样更改GROUP_CONCAT中的参数:

GROUP_CONCAT(cp.user_id,'/',cp.user_name) as user

希望能有所帮助。

相关问题