【问题标题】:MySQL column data returned as comma delimited listMySQL 列数据以逗号分隔列表形式返回
【发布时间】:2012-06-11 20:35:03
【问题描述】:

我目前有一个 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;

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

谢谢

【问题讨论】:

  • 我非常强烈地反对GROUP_CONCAT - 我觉得这就像滥用数据库引擎。
  • @jnylen - 不知道为什么,MySQL 人员也没有对此提出警告,问题被标记为 MySQL,而不是 PHP。 - 对每个他自己的朋友,只是说:)
  • @GregP 我猜这是因为数据库操作应该操作并返回数据表——它们不应该处理像逗号分隔的字符串这样的“假”数据类型,所以这是一种不好的“代码味道”大部头书。任何时候你有一个逗号分隔的列表,你可能应该把它放在行或数组中。这是您可能面临的问题的一个很好的例子:stackoverflow.com/questions/6643656/…
  • 公平的回应,虽然我很不同意。要求数据库引擎返回我喜欢的格式与结构或规范化无关。

标签: mysql


【解决方案1】:

你想使用 GROUP_CONCAT :

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

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

【讨论】:

  • 当然也可以在 GROUP_CONCAT 中指定分隔符 :)
  • 谢谢!你无法想象我有多高兴这个函数存在于 MySQL 中!!
  • 如果结果很大,它不起作用,因为限制是 1024,并且在某些共享主机上它会成为问题。无法设置全局规则。
【解决方案2】:

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

$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 injection 攻击至关重要
  • 取决于您实际执行的操作 - 存储以逗号分隔的字符串列表很可能不是一个好方法。

【讨论】:

    【解决方案3】:
    $sql = "SELECT GROUP_CONCAT (DISTINCT friend SEPARATOR ',') 
          FROM table_friends GROUP BY id 
           HAVING id =".$user_id; 
    

    【讨论】:

      【解决方案4】:

      您可能正在寻找GROUP_CONCAT(column) 函数。示例herehere

      【讨论】:

        【解决方案5】:

        我使用了一个名为 @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)
        

        【讨论】:

          猜你喜欢
          • 2018-10-05
          • 2019-08-06
          • 1970-01-01
          • 2013-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多