5

我目前有一个 MySQL 表,如:

id | friend
1  |   2
1  |   5
1  |   10
3  |   6
15 |   19
21 |   4

我正在尝试获取一个特定用户的所有朋友 ID,并将它们排列成一个逗号分隔的列表。例如,抓取 user1 的好友,返回为

$friend_list = 2,5,10

目前,我有:

$sql = "SELECT friend FROM table__friends WHERE id = ".$user_id;

不过,这只占一排..请帮忙!

谢谢

4

5 回答 5

13

您想使用 GROUP_CONCAT :

$sql = "SELECT GROUP_CONCAT(friend) FROM table__friends GROUP BY id HAVING id = ".$user_id;

根据更好的答案调整正确性。

于 2012-06-11T20:37:19.013 回答
4
$sql = "SELECT GROUP_CONCAT (DISTINCT friend SEPARATOR ',') 
      FROM table_friends GROUP BY id 
       HAVING id =".$user_id; 
于 2012-06-11T20:39:14.513 回答
1

您的查询将返回多行 - 听起来您只是在阅读第一行。你想要这样的东西:

$sql = "SELECT friend FROM table__friends WHERE id = "
  . mysql_real_escape_string($user_id);

$result = mysql_query($sql);
if (!$result) {
  die("Something bad happened");
}

$friend_arr = array();
while ($row = mysql_fetch_array($result)) {
  $friend_arr[] = $row[0];
}

$friend_list = implode(',', $friend_arr);

发布您用于运行查询的 PHP 代码,我们将能够提供更多帮助。

几点注意事项:

  • 我添加了mysql_real_escape_string功能。以这种方式清理用户输入对于避免SQL 注入攻击至关重要。
  • 取决于您实际在做什么 - 存储以逗号分隔的字符串列表很有可能不是一个好方法。
于 2012-06-11T20:43:54.147 回答
0

您可能正在寻找GROUP_CONCAT(column)功能。这里这里的例子。

于 2012-06-11T20:39:16.307 回答
0

我使用了一个名为 @a 的变量来存储 id,最后你有变量中的值或尝试使用限制、分组排序,如下所示:

mysql> show create table actor\G
*************************** 1. row ***************************
       Table: actor
Create Table: CREATE TABLE `actor` (
  `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`actor_id`),
  KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


mysql> set @a:=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @a:=concat(@a,",",actor_id) as actor_id from actor where actor_id>195 order by (actor_id) desc limit 1;
+----------------------------+
| actor_id                   |
+----------------------------+
| 0,196,197,198,199,200,205, |
+----------------------------+
1 row in set (0.00 sec)

在您的情况下,更改“WHERE 条件”

或者你也可以在选择之后:

mysql> select @a;
+-------------------------------+
| @a                            |
+-------------------------------+
| 0,196,197,198,199,200,205,206 |
+-------------------------------+
1 row in set (0.00 sec)
于 2012-06-11T20:43:48.223 回答